簡體   English   中英

這是接受自簽名證書的有效方法嗎?

[英]Is this a valid approach to accept self-signed certificates?

我編寫了以下代碼,以接受來自服務器的所有自簽名證書:

private TrustManager[] createTrustManager() {
        TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {

            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }

            public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                if (!chain[0].getIssuerDN().equals(chain[0].getSubjectDN())) {
                    throw new CertificateException("This is not a self-signed certificate");
                }
            }

            public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                // leave blank to trust every client
            }
        }};
        return trustAllCerts;
    }

這是有效且充分的方法嗎?

盡管可以做到,但是您的方法基本上否認了適當的PKI的目的。 如果您盲目地信任任何自簽名證書,那么根本就沒有使用TLS的任何人都可以創建將通過TrustManager的自簽名證書。

因此,如果您想確保安全 ,則應該首先找出客戶端應用程序將與之通信的服務器,然后獲取鏈接到這些服務的TLS服務器證書(在您的方案中,每個服務器都是自簽名的,因此您不需要關心中間證書)。

現在,使用這些證書,您將創建一個JKS“信任存儲”文件並將其放入其中-這是您要信任的一組證書,該文件中未包含的證書將被拒絕。 要創建JKS文件,可以使用Java的keytool命令,也可以使用KeyStore API以編程方式進行操作。

最后,您將創建供HttpClient使用的SSLContext ,並使用如下創建的TrustManager對其進行init

KeyStore ks = KeyStore.getInstance("JKS");
ks.load(fin, pwd);
TrustManagerFactory tmf = TrustManagerFactory.getInstance("PKIX");
tmf.init(ks);

其中finInputStream你的“信任存儲”和pwd您用於加密的密碼。 默認的TrustManager實現使您只需要使用一組受信任的證書,其余的工作TrustManager您來處理。

暫無
暫無

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

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