亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Jetty 升級到 9.4.19.v20190610 后,傳入的客戶端請求中未出現 X509 證書

Jetty 升級到 9.4.19.v20190610 后,傳入的客戶端請求中未出現 X509 證書

明月笑刀無情 2023-06-04 10:25:38
Jetty 升級到后,我沒有在傳入的客戶端請求中獲得 X509 證書9.4.19.v20190610certifcates = (X509Certificate[])request.getAttribute("javax.servlet.request.X509Certificate");這里的證書是空的。雖然他們是 Jetty 版本9.4.11.v20180605我的客戶端程序:private static String loginWithCertificate(String aEndPointURL) {    String line = "";    try {        final String CERT_ALIAS = "employee1";        String CERT_PASSWORD = "changeit";        KeyStore identityKeyStore = KeyStore.getInstance("jks");        FileInputStream identityKeyStoreFile = new FileInputStream(new File(ResourceUtils.getFile("./stores/client1.jks").getAbsolutePath()));        identityKeyStore.load(identityKeyStoreFile, CERT_PASSWORD.toCharArray());        KeyStore trustKeyStore = KeyStore.getInstance("jks");        FileInputStream trustKeyStoreFile = new FileInputStream(new File(ResourceUtils.getFile("./stores/truststore1.jks").getAbsolutePath()));        trustKeyStore.load(trustKeyStoreFile, CERT_PASSWORD.toCharArray());        SSLContext sslContext = SSLContexts.custom()                // load identity keystore                .loadKeyMaterial(identityKeyStore, CERT_PASSWORD.toCharArray(), new PrivateKeyStrategy() {                    @Override                    public String chooseAlias(Map<String, PrivateKeyDetails> aliases, Socket socket) {                        return CERT_ALIAS;                    }                })                // load trust keystore                .loadTrustMaterial(trustKeyStore, null).build();        SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext,                new String[] { "TLSv1.2", "TLSv1.1", "TLSv1"  }, null, SSLConnectionSocketFactory.STRICT_HOSTNAME_VERIFIER);        CloseableHttpClient client = HttpClients.custom().setSSLSocketFactory(sslConnectionSocketFactory).build();        }}
查看完整描述

1 回答

?
紫衣仙女

TA貢獻1839條經驗 獲得超15個贊

仔細查看您的服務器端 SslContextFactory 使用情況,并著眼于您實際使用的內容(剝離以僅顯示 SslContextFactory 使用情況)


SslContextFactory sslContextFactory = new SslContextFactory();

sslContextFactory.setKeyStoreResource(Resource.newResource(urlKeyStore));

sslContextFactory.setKeyStorePassword(credential);

sslContextFactory.setExcludeCipherSuites(

        "SSL_RSA_WITH_DES_CBC_SHA",

        "SSL_DHE_RSA_WITH_DES_CBC_SHA",

        "SSL_DHE_DSS_WITH_DES_CBC_SHA",

        "SSL_RSA_EXPORT_WITH_RC4_40_MD5",

        "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA",

        "SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA",

        "SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA");

sslContextFactory.setExcludeProtocols("");

有幾件事很突出。


首先,既然你是服務端,那你就應該使用服務端版本...


SslContextFactory sslContextFactory = new SslContextFactory.Server();

接下來,您的使用.setExcludedCipherSuites()不完整并引入了漏洞。


刪除(或注釋掉)整行。

使用 SslContextFactory 為您提供的默認值。

通過該行,可以為 TLS/SSL 使用無證書和無加密配置。


另外,你的使用setExcludedProtocols("")不好。它正在設置要排除的單個空白協議。這很糟糕,因為您將自己暴露于各種 SSL 漏洞(更不用說 TLS 漏洞了)


也刪除(或注釋掉)整行。

使用 SslContextFactory 為您提供的默認值。

通過該行,可以為 TLS/SSL 使用無協議(這意味著無加密)配置。


上述 2 個配置會產生大量警告日志,您應該努力擁有一個沒有警告的配置。


對于上述兩個問題,您可能會從連接中使用的密碼套件的名稱中了解到一些信息。


String cipherSuiteName = 

    (String) HttpServletRequest.getAttribute("javax.servlet.request.cipher_suite");

您甚至可以獲得javax.net.ssl.SSLSession連接中使用的。


SslSession sslSession = 

    (SslSession) HttpServletRequest.getAttribute(

        "org.eclipse.jetty.servlet.request.ssl_session");

System.out.println("protocol is " + sslSession.getProtocol());

System.out.println("cipher suite is " + sslSession.getCipherSuite());

System.out.println("peer certs is " + sslSession.getPeerCertificates());

最后,您的代碼沒有任何跡象表明您甚至想要來自該配置的客戶端證書。


你是否忘記了其中一個...


sslContextFactory.setNeedClientAuth(true);

sslContextFactory.setWantClientAuth(true);

還是您真的不需要客戶證書?


查看完整回答
反對 回復 2023-06-04
  • 1 回答
  • 0 關注
  • 185 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號