簡體   English   中英

Java SSL證書

[英]Java SSL Certificate

我需要在兩個桌面Java應用程序之間進行通信,而做到這一點的最佳方法是使用SSL(以防止嗅探器)。 我同時控制客戶端和服務器,因此可以自簽名。

我的問題是,是否可以通過編程方式從頭開始制作和使用證書(即最終用戶不必親自做任​​何事情)。

如果可能的話,您能給我一些指導嗎?

我的問題是,是否可以通過編程方式從頭開始制作和使用證書(即最終用戶不必親自做任​​何事情)。

在考慮生成證書(以編程方式或不以編程方式)之前,您需要確定如何驗證它們。 在兩個桌面應用程序的上下文中,驗證服務器證書的傳統方法可能不合適。

證書的目的是提供一種驗證遠程方身份的方法,以防止中間人攻擊。 驗證方使用已經信任的東西進行驗證; 不這樣做會使使用證書毫無意義。

在傳統模型(具有固定服務器)中,服務器證書是PKI的一部分,由CA頒發。 客戶端針對它信任的一組CA證書驗證其真實性(通常使用RFC 5280中描述的規則,並驗證該證書對於正在尋找的主機名有效(如何完成取決於協議,但最好)和歷史慣例在RFC 6125中進行了描述。這兩個步驟都是防止MITM攻擊所必需的,這類似於使用護照來驗證某人的身份:您要檢查護照是真實的,並且要從您信任的權威機構那里檢查,該名稱(或圖片)與您要查找的名稱(或您面前的臉)相匹配。

在兩個桌面應用程序之間建立通信時,您肯定會在兩個方面都遇到問題:如何讓客戶端驗證證書是由您信任的實體發布的,還是已頒發給您要與之通信的實體。 如果您沒有通過編程方式生成證書的任何一方,那么肯定會是自簽名的,這將使得在沒有其他交換方式(獨立於此SSL / TLS通信)的情況下,很難從另一方驗證其真實性。 此外,台式機往往沒有固定的主機名,因此在這種情況下基於DNS的(或什至IP地址)標識符可能不足。

您需要考慮一種以遠程方可以驗證其信任的方式發布證書的方法,並考慮一種確定方案以確保證書屬於正確的實體(通常就是這種情況)。證書的“主題DN”或“主題備用名稱”擴展名)。

做出這些決定后,可以使用BouncyCastleorg.bouncycastle.x509.X509V3CertificateGenerator生成證書(如果需要,X.509 v3證書應允許您向證書添加擴展名,例如出於密鑰使用目的)他們)。 BouncyCastle Wiki上有各種示例(適用於v1,v3和/或自簽名,即,其中Subject = Issuer)。 我要說的是,使用此選項很容易(信任的管理方面將是最困難的)。

如果這兩個桌面應用程序實際上都是更中央應用程序的一部分,則可以運行一個應用程序,該服務根據應用程序內生成的證書請求(CSR)頒發此證書。 中央服務器將有效地運行您自己的CA,而您的桌面應用程序將信任該CA。 根據您組織的復雜性,可以使用一些工具來執行此操作,或者您也可以使用相同的類使用BouncyCastle來實現它(如果實現CRL / OSCP以能夠撤消證書,甚至會更好)。 在這種情況下,您可以使您的應用程序生成CSR,並將其提交到中央CA。 可以使用BouncyCastle使用PKCS10CertificationRequest生成CSR。 同樣,您的CA如何使用外部信息驗證CSR是否來自正確的參與者,這也是一個管理問題,也許您可​​以將其與電子郵件驗證方案或類似的東西聯系在一起。

生成證書后,就可以將Java的JSSE用作SSL / TLS堆棧(通常使用SSLSocket )。 您可能必須使用自定義X509TrustManager來實現證書驗證(如果您無法使用傳統的CA模型,則取決於您設計方案的方式來驗證證書)。 只要確保您不使用在check*方法中不做任何事情的信任管理器即可; 周圍有很多這樣的示例:如果您不做任何驗證它們的事情,那么在這種情況下您可能根本不使用證書(這會使連接容易受到MITM攻擊)。

您可以將基於JCE的解決方案與SSLSocket,jdk6及其實現的文檔一起使用 :SSLSocketImpl。

Java SSL SSH:

您擁有Jsch lib可以通過SSH協議連接到任何服務器。

用於SSL的Java工具箱:

你有充氣城堡 查看他們的資源文檔 Wiki提供了一些有用的示例以及最新版本:

ContentSigner sigGen = ...;
PublicKey publicKey = ....;

Date startDate = new Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000);
Date endDate = new Date(System.currentTimeMillis() + 365 * 24 * 60 * 60 * 1000);

X509v1CertificateBuilder v1CertGen = new JcaX509v1CertificateBuilder(
          new X500Principal("CN=Test"), 
          BigInteger.ONE, 
          startDate, endDate, 
          new X500Principal("CN=Test"), 
          publicKey);

X509CertificateHolder certHolder = v1CertGen.build(sigGen);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM