2017-04-17 122 views
0

我想弄清楚兩種分佈式服務之間的身份驗證方式。如何使用(並創建)用於JWT令牌的私鑰/公鑰加密的X509證書

我不想在每個服務主機上分配一個共享密鑰,因爲這意味着一旦一臺主機遭到入侵,所有主機都會受到攻擊。

所以我的情況是:

  • 主機A就知道了主機B的公鑰
  • 主機A編碼和encryptes使用主機B's公鑰
  • 主機B的智威湯遜接收並使用其私鑰解密jwt,它只知道自己。

何塞 - 智威湯遜包: https://github.com/dvsekhvalnov/jose-jwt

似乎是一個不錯的選擇我。除了簽署jwt之外,它還支持使用私鑰/公鑰進行加密。

在有編碼下面的例子和頁面解碼JWT:

編碼:

var publicKey=new X509Certificate2("my-key.p12", "password").PublicKey.Key as RSACryptoServiceProvider; 

string token = Jose.JWT.Encode(payload, publicKey, JweAlgorithm.RSA_OAEP, JweEncryption.A256GCM); 

解碼:

var privateKey=new X509Certificate2("my-key.p12", "password", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet).PrivateKey as RSACryptoServiceProvider; 

string json = Jose.JWT.Decode(token,privateKey); 

現在,這裏是我不明白的:

  • 如何創建一個只包含公鑰信息(編碼JWT主機/服務A)一個的.p12證書文件?
  • ..以及如何創建一個包含公鑰和私鑰信息(用於解碼jwt的主機/服務B)的.p12證書文件?

從我所做的所有研究中,我得到的印象是您只能製作一個包含兩者的.p12文件,或者只包含公鑰的文件。但似乎沒有辦法創建兩個.p12文件,一個包含兩個信息,一個只包含公鑰。我錯過了什麼?

感謝您的回答。

回答

0

通常,PKCS12/PFX不用於公衆使用,但您可以根據需要進行操作。

假設cert.HasPrivateKeytruecert.Export(X509ContentType.Pkcs12, somePassword)會產生byte[],你可以寫爲「publicAndPrivate.p12」(或其他)。

正常情況下,對於僅公開證書,您可以像X.509數據一樣將其寫下來,或者是DER-binary或PEM-DER編碼。 .NET不會使PEM-DER變得簡單,所以我們將堅持使用DER-binary。您可以通過cert.RawDatacert.Export(X509ContentType.Cert)獲得該數據(兩者將產生相同的結果,因爲此導出表單中沒有隨機數據)。 (publicOnly.cer)

如果你真的其剛剛公衆證書PKCS12斑點:

using (X509Certificate2 publicOnly = new X509Certificate2(publicPrivate.RawData)) 
{ 
    return publicOnly.Export(X509ContentType.Pkcs12, somePassword); 
} 

產生的byte[]便可設爲publicOnly.p12。