I don't know if you've seen it, but the other Google result for the exact string "Crypto credential expired" is this old post: http://wtfruby.com/python/2016/11/01/gspread-token-refresh.html
(based on the publication date and the release timeline for gspread, the author was likely also using v0.4.1).
Are you sure you're calling login() not just every time you retrieve a sheet but also when you update/edit/make any API call to Google Sheets? If so, I haven't been able to find where the specific error message ("Crypto credential expired") is coming from but it might be coming from the Google end of things. Apparently there have been issues with some Google APIs in the past with telling you that the token is invalid or expired as a sort of catch-all exception that doesn't necessarily mean the token is actually invalid/expired (this old StackOverflow post: http://stackoverflow.com/questions/17813621/oauth2-0-token-strange-behaviour-invalid-credentials-401)-
on some Google APIs, some small changes to your session data can trigger an expiry/invalid token error.
So there could be some arbitrary issue going on in the background (some hard-to-predict mess with the session parameters?) that only occurs some of the time, in which case, if you're running something like a cron job, you can perhaps set up a cron retry for when you hit a 401 error.
If you haven't already, you could also check the Google Developer Console to see if this was an error triggered by Google and if so, what about the request caused it. Might find something weird in your request header, perhaps. Given that gspread seems stable enough for the most part + I can't find any documentation anywhere of anything other than an expired token triggering this issue on the gspread end, my guess would be something funky going on with the session parameters.
Also might not hurt to manually check with Google's token verifier yourself: https://www.googleapis.com/oauth2/v1/tokeninfo
. Could be a faster way to seeing how to reproduce the error.
Edited 4/28/2017 18:30:54