分享

.Net Core中使用RSA遇到的問題

這幾天因為工作的關係在寫.Net Core微服務的token server,實作確認user身分後回傳使用RS256演算法的JWT token,然後就遇到了public / private key與rsa相關的問題。這邊用的jwt.io裡選的一個library,其中一個解密的示範是這樣:
  

var json = JwtBuilder.Create()                      

.WithAlgorithm(new RS256Algorithm(certificate)) // asymmetric                     .MustVerifySignature()             

.Decode(token);         

所以大致上可以想像得出來加密就是把Decode(token)改成Encdoe之類的,但new RS256Algorithm(certificate)那個certificate是甚麼鬼?看了Constructor之後發現是:
微服務 JWT RSA PUTTY
因為一開始接觸public / private key就是用putty產生的,下意識就覺得應該要有那裏可以放public / private的key string進去,但研究了半天X509也不得其門而入,遂放棄,轉而用RSA:
微服務 JWT RSA PUTTY
要求publicKey和privateKey的應該是給加密方(也就是token server)用,而只要publicKey的是給其他相關server驗證用,當然這邊還是要看每個人專案結構。
RSA輸入金鑰字串的方法(以publicKey舉例)為:
  

var publicRSA = RSA.Create();

var publicKeyBytes = Convert.FromBase64String(publicKeyString);

publicRSA.ImportRSAPublicKey(publicKeyBytes, out int _);

但是從putty產生的.ppk檔(或是從puttygen介面上)複製貼上的publicKey卻一直在ImportRSAPublicKey這行報錯:
System.Security.Cryptography.CryptographicException: ASN1 corrupted data.
查了一整天,最後發現原來是格式的不同,putty產生的.ppk檔裡面的publicKey是ssh格式,或是如果看到整個檔案開頭是:
---- BEGIN SSH2 PUBLIC KEY ----
那就是一樣的問題,而使用RSA這個class吃的格式RSA,開頭是:
-----BEGIN RSA PUBLIC KEY-----
或是:
-----BEGIN PUBLIC KEY-----
反正,puttygen的公鑰不能直接拿來用,同樣puttygen產生的ppk裡面私鑰也不能直接拿來用,要另存檔案格式:
微服務 JWT RSA PUTTY
打開來之後會發現開頭變成:
-----BEGIN RSA PRIVATE KEY-----
但public key怎麼辦?找了半天也沒找到可以用putty產生除了SSH以外的格式,後來發現可以用openssl從私鑰產生公鑰:
openssl rsa -in private.pem -pubout > public.pub
產生出來的public key就是-----BEGIN PUBLIC KEY-----格式的,於是至此可以將這兩個金鑰字串餵給RSA了。
結語:也不知道該怪自己當初沒好好學還是怎的,這一個問題就弄了一兩天,還不知道到底是不是一知半解,記錄下來希望能幫到其他人吧。
#微服務  #JWT  #RSA  #PUTTY 
分類:學習

評論
更多文章
載入中... 沒有更多了