0

由于来自网站的所有证书都由 Root CA 等签名,而且我正在编写一个客户端,而不是服务器,我将如何创建一个可以连接到它们的 SSLEngine?还是我必须下载证书等才能连接?(我希望 jdk 具有与浏览器有关证书的所有相同信息,因此这样做应该很容易,尽管我在查找它时遇到了问题,因为大多数链接都是服务器)。

编辑:为了更清楚起见,我有这样的客户端代码,它可以与自签名证书一起使用。目前,我通过chrome点击锁从我想要的网站下载了证书。然后我将它导入到我的密钥库中,但它仍然无法正常工作......

private SSLEngine createEngine() {
    try {

        InputStream in = this.getClass().getResourceAsStream("/prodKeyStore.jks");

        //char[] passphrase = password.toCharArray();
        // First initialize the key and trust material.
        KeyStore ks = KeyStore.getInstance("JKS");
        ks.load(in, "lP9Ow1uYXZr9zgt6".toCharArray());
        SSLContext sslContext = SSLContext.getInstance("TLS");

        //****************Client side specific*********************
        // TrustManager's decide whether to allow connections.
        TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
        tmf.init(ks);
        sslContext.init(null, tmf.getTrustManagers(), null);        
        //****************Client side specific*********************

        SSLEngine engine = sslContext.createSSLEngine();
        engine.setUseClientMode(true);
        return engine;
    } catch(Exception e) {
        throw new RuntimeException("Could not create SSLEngine", e);
    }
}

接下来,我将尝试弄清楚如何打开调试以进行 ssl 交换,看看是否有帮助。目前,我不知道为什么这不起作用。

哎哟,调试日志指向这个

javax.net.ssl|DEBUG|21|httpclient2|2020-02-18 08:13:05.095 MST|CertificateMessage.java:358|Consuming server Certificate handshake message (
"Certificates": [
  "certificate" : {
   "version"            : "v3",
   "serial number"      : "00 90 76 89 18 E9 33 93 A0",
   "signature algorithm": "SHA256withRSA",
   "issuer"             : "CN=invalid2.invalid, OU="No SNI provided; please fix your client."",
   "not before"         : "2014-12-31 17:00:00.000 MST",
   "not  after"         : "2029-12-31 17:00:00.000 MST",
   "subject"            : "CN=invalid2.invalid, OU="No SNI provided; please fix your client."",
   "subject public key" : "RSA",
   "extensions"         : [

所以有些东西把事情搞砸了,但还不确定是什么。这是jdk8。不知道如何解决这个问题。

谢谢,院长

4

1 回答 1

0

原来有一条线错了,一定是这个

SSLEngine engine = sslContext.createSSLEngine(host, port);

然后一切正常!

于 2020-02-18T17:52:38.143 回答