2014-01-08 68 views
0

我希望能夠連接到需要通過智能卡進行身份驗證的個人證書的https站點。我覺得我非常接近擁有它的工作,但不知道如何讓過去這個異常:Java客戶端SSL套接字unknown_ca

javax.net.ssl.SSLHandshakeException: Recieved fatal alert: unknown_ca 

我不能夠分享我的,因爲合同的代碼,但這裏有一個總結:

我創建了一個包含從瀏覽器中導出的所有證書的密鑰庫。我使用這個密鑰庫作爲SSLContext的信任庫。我非常肯定,這個密鑰庫包含正確的CA證書來驗證遠程站點的證書,因爲它修復了「無法找到有效的證書路徑到請求的目標」異常。

我可以以編程方式使用智能卡讀卡器創建一個密鑰庫,作爲與此處描述的技術類似的提供程序:Common Access Card (CAC) Authentication Using Java。從智能卡創建的密鑰庫包含我的個人證書。當我使用它作爲SSLContext的密鑰庫時,這將解決錯誤消息:「收到致命警報:handshake_failure」。

所以,看來我越來越近!但是我看到最近的堆棧跟蹤是:

javax.net.ssl.SSLHandshakeException: Recieved fatal alert: unknown_ca 

我加入了JVM標誌-Djavax.net.debug=ssl和我看到好的SSL調試信息,但不知道如何讀的調試跟蹤來找出哪些CA是未知的?

一個問題:truststore密鑰庫包含所有CA證書。但是從智能卡創建的密鑰庫不包含任何CA證書(它只包含智能卡上的個人證書)。也許我需要將CA添加到密鑰庫?

Andy有關我可能會丟失什麼和/或如何解釋ssl調試輸出的其他建議/想法?

回答

0

看來我需要從智能卡創建密鑰庫時傳遞提供程序。

若要從智能卡密鑰庫,我創建了一個card.config文件,然後按此處所述使用此代碼:Common Access Card (CAC) Authentication Using Java

Provider provider = new sun.security.pkcs11.SunPKCS11("card.config"); 
Security.addProvider(provider); 

然後,我用這樣的代碼來創建密鑰庫:

KeyStore ks = KeyStore.getInstance("PKCS11"); 

更改該行以下似乎已經解決了 「unknown_ca」 的問題:

KeyStore ks = KeyStore.getInstance("PKCS11", provider); 

更新:作爲第二參數添加提供程序後,它工作了一段時間,但現在我再次看到unknown_ca錯誤?!