簡體   English   中英

如何在 Spring Boot 中發送帶有請求的 .p7b 格式客戶端證書?

[英]How to send a .p7b format client certificate with request in spring boot?

我對 SSL/TLS 還很陌生。 我正在編寫一個 java 客戶端,它將對 URL 執行簡單的 get 請求。 但連同 URL 一起,我必須發送提供給我的客戶端證書(.p7b)。 我已經提取了 .p7b 文件中存在的所有證書以分離 .cert 文件並將這些 .cert 文件添加到 java 信任存儲中。 但是,在我到達該端點時執行所有步驟后,我收到此警告

*** ServerHelloDone
[read] MD5 and SHA1 hashes:  len = 4
0000: 0E 00 00 00                                        ....
Warning: no suitable certificate found - continuing without client authentication
*** Certificate chain
<Empty>
***

這是我用於配置其余模板的 java 代碼

@Bean
    public RestTemplate getTemplate(RestTemplateBuilder builder) throws Exception{
        char[] password = "changeit".toCharArray();

        SSLContext sslContext = SSLContextBuilder.create()
                .loadTrustMaterial(keyStore("classpath:truststore/truststore.jks", password), new TrustSelfSignedStrategy())
                .build();
        HttpClient client = HttpClients.custom().setSSLContext(sslContext).build();
        return builder
                .requestFactory(new HttpComponentsClientHttpRequestFactory(client))
                .build();   
        
    }
    
    private KeyStore keyStore(String file, char[] password) throws Exception {
        KeyStore keyStore = KeyStore.getInstance("JKS");
        File key = ResourceUtils.getFile(file);
        try (InputStream in = new FileInputStream(key)) {
            keyStore.load(in, password);
        }catch(Exception e) {
            e.printStackTrace();
        }
        return keyStore;
    }

我無法弄清楚我錯過了什么。 請幫忙

如果“發送 [a] 客戶端證書”實際上是指進行 SSL/TLS 客戶端身份驗證,即使您省略了將直接顯示它的日志部分,您嘗試連接的服務器也明確要求,這不僅包括發送證書。 發送證書並不能證明身份,因為任何人都可以復制和發送證書。 要進行身份驗證和證明身份,您系統中的 SSL/TLS 實現(這里是 Java 的 JSSE 組件)必須同時發送證書以及鏈式證書(如果需要),並使用相應的私鑰對某些數據進行簽名握手。 有些人只注意到第一部分,因此只談論第一部分,但沒有第二部分就毫無用處。

簡而言之,僅僅發送證書是沒有用的,這意味着只有證書是沒有用的。 您必須同時擁有證書(通常是鏈)和私鑰,而您顯然沒有,因為 p7b 不能包含私鑰。

正常和推薦的程序是您從 CA(或從 CA 獲得證書的人)獲得證書 - 可能但不一定是 p7b,因為您首先生成並給了他們一個 CSR(證書簽名請求),在這種情況下,您已經擁有私鑰——找到它並使用它。 使用它的方法取決於它的形式,這又取決於你如何生成它,你沒有說,但你最終會想要一個KeyStore對象,你可以給.loadKeyMaterial NOT Trust (如果服務器正在使用不是已建立的“公共”CA 之一的 CA(或錨點)下的證書,則您只需要或應該使用.loadTrustMaterial 。)

如果其他人生成了 CSR 並(然后)獲得了證書,則他們需要向您提供私鑰,或者您需要從他們那里獲取私鑰,然后將其與上述證書一起使用。

暫無
暫無

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

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