【问题标题】:Establish client/server SSL connection with browser and my java server?与浏览器和我的 java 服务器建立客户端/服务器 SSL 连接?
【发布时间】:2011-11-13 05:45:40
【问题描述】:

我正在尝试创建一个 HttpsServer/Client,以便我可以创建一个代理来检查从浏览器到服务器的流量。这些类型的工具对于测试 Web 应用程序安全性的人来说是无价的。我决定使用 httpclient 为我的服务器发送请求和 httpcore 组件。目前我只是试图在端口 8080 上建立浏览器和服务器之间的 ssl 套接字连接。我已经阅读了所有内容,但似乎仍然无法让它工作。以下是我到目前为止所做的步骤:

  1. 使用 keytool 创建 CA 证书并将其添加到名为 cacerts 的文件中

  2. 我将此证书添加到监听端口 8080 的 firefox 浏览器实例

  3. 在我的代码中,我执行以下操作以在服务器代码中调用该证书

        KeyStore ks = KeyStore.getInstance("JKS");  
        ks.load(new FileInputStream("C:\\Program Files\\Java\\jre6\\bin\\cacerts"), "password".toCharArray());
    
        KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
        kmf.init(ks, "password".toCharArray());
    
        SSLContext context = SSLContext.getInstance("TLS");
        context.init(kmf.getKeyManagers(), null, null);
    
    
        ServerSocketFactory ssocketFactory = SSLServerSocketFactory.getDefault();
        serversocket = ssocketFactory.createServerSocket(port);
    

然后当我在套接字上调用接受时,如下所示,我得到以下异常:

I/O error initialising connection thread: No available certificate or key corresponds    to the SSL cipher suites which are enabled.
 javax.net.ssl.SSLException: No available certificate or key corresponds to the SSL     cipher suites which are enabled.
 at com.sun.net.ssl.internal.ssl.SSLServerSocketImpl.checkEnabledSuites(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLServerSocketImpl.accept(Unknown Source)
at DefaultHttpServer$RequestListenerThread.run(DefaultHttpServer.java:151) 

这是抛出异常的行:

   Socket socket = serversocket.accept(); 

关于我在这里做错了什么有什么想法吗?只是尝试与浏览器发送请求的端口 8080 建立 ssl 套接字连接。

11 月 13 日更新

到目前为止,我获取了您的一些信息并创建了一个单独的密钥库文件。这就是我所做的

C:\Users\Steve>keytool -genkey -alias serverprivkey -keystore privateKey.store

然后我将此文件 privateKey.store 从我的用户目录复制到我的项目文件夹中,并在我的代码中进行了以下更改:

        KeyStore ks = KeyStore.getInstance("JKS");  
        ks.load(new FileInputStream("privateKey.store"), "pass123".toCharArray());

        KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
        kmf.init(ks, "pass123".toCharArray());

我知道它正确地抓取了该文件,因为如果密码错误,我会遇到异常。但是,我仍然遇到同样的异常。有什么想法可以尝试下一步吗?

这是 privateKey.store 里面的内容:

 C:\Users\Steve>keytool -list -v -keystore privateKey.store
Enter keystore password:

Keystore type: JKS
 Keystore provider: SUN

Your keystore contains 1 entry

Alias name: serverprivkey
Creation date: Nov 13, 2011
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=sven rbera, OU=application developement, O=whs, L=san hjose, ST=
 ca, C=ca
 Issuer: CN=sven rbera, OU=application developement, O=whs, L=san hjose, ST
 =ca, C=ca
 Serial number: 4ec00a18
 Valid from: Sun Nov 13 10:19:04 PST 2011 until: Sat Feb 11 10:19:04 PST 2012
 Certificate fingerprints:
     MD5:  9C:A7:2B:CE:DC:AD:5B:9C:D6:B7:71:6C:EC:91:8A:24
     SHA1: 47:8F:9B:A2:E1:31:A5:D9:F6:71:8A:CA:3F:CB:BA:FC:C7:2D:F5:A8
     Signature algorithm name: SHA1withDSA
     Version: 3


如前所述,我已将密钥更改为现在使用 RSA。此外,我为 SSL 添加了调试标志并使其可用。完全理解它有点棘手,但看起来它找到了密钥 serverprivkey2 就好了。然后它进入 trustStore,我在该列表中看不到任何看起来像是来自我的东西。我真的不知道我应该在那个部分看到什么。有什么想法吗?

            ***
            found key for : serverprivkey2
            chain [0] = [
            [
              Version: V3
              Subject: CN=steve, OU=labarbera, O=whs, L=sj, ST=ca, C=ca
              Signature Algorithm: SHA1withRSA, OID = 1.2.840.113549.1.1.5

              Key:  Sun RSA public key, 1024 bits
              modulus: 140985119594686674696976228136679950023710897166974487014150510574037897724033913877362573524361519470364814271848450916151017718803985253447854099124509296799994400199293690731598145912452994962103007955337967369473821653235218532303270695076070736956288068926075705380732910518314547899958542901647381772169
              public exponent: 65537
              Validity: [From: Sun Nov 13 14:45:44 PST 2011,
                           To: Sat Feb 11 14:45:44 PST 2012]
              Issuer: CN=steve, OU=labarbera, O=whs, L=sj, ST=ca, C=ca
              SerialNumber: [    4ec04898]

            ]
              Algorithm: [SHA1withRSA]
              Signature:
            0000: C8 81 37 74 E9 7C A4 76   9F FD EC 8A 78 69 F2 A4  ..7t...v....xi..
            0010: 64 1E C9 98 FD 99 FB 48   3D E2 C5 C5 EB A3 34 1B  d......H=.....4.
            0020: 7C BE B3 E4 F7 4D 90 F1   AB A6 4D 36 97 95 9B 95  .....M....M6....
            0030: 90 C1 B9 28 9C DE A0 4A   AD C7 10 8F 06 57 A6 2B  ...(...J.....W.+
            0040: 51 45 63 73 ED 1E AF 5F   61 E2 87 1A 7C CD 4E 3F  QEcs..._a.....N?
            0050: A7 18 15 FA 73 94 58 46   62 46 42 F9 31 12 2F C7  ....s.XFbFB.1./.
            0060: 6E 6E A0 3F 17 FA A8 24   FC 68 83 88 E2 23 EF DE  nn.?...$.h...#..
            0070: E9 F5 58 AB 16 19 1B 82   72 C6 A0 A7 7E 41 36 1C  ..X.....r....A6.

            ]
            ***

trustStore is: C:\Program Files\Java\jre6\lib\security\cacerts
trustStore type is : jks
trustStore provider is : 
init truststore
adding as trusted cert:
... bunch certs none of which look familiar?

【问题讨论】:

    标签: java sockets ssl


    【解决方案1】:

    1.使用keytool创建一个CA证书并将其添加到名为cacerts的文件中

    我不明白你在这里做了什么。
    您是否创建了公钥/私钥对并将其存储到 cacerts 密钥库?
    您不应该这样做。
    cacerts 旨在用作 信任库 而不是密钥库。

    您应该已经创建了一个新的密钥库并加载了它以供您的KeyManager 使用。

    异常是模棱两可的。
    要么它无法在 cacerts 中找到私钥,这可能与您选择的别名有关,要么证书没有用于加密的适当扩展名。
    我相信别名问题是最有可能的问题。

    我建议不要尝试调试它。
    而是为您的服务器创建一个单独的密钥库并加载它。
    不要使用cacert

    更新:确保在 keytool 命令中使用 RSA 作为密钥算法

    【讨论】:

    • 所以,我创建了以下内容: C:\Users\Steve>keytool -genkey -alias serverprivkey -keystore privateKey.store 比我将 privateKey.store 粘贴到我的项目中并使用仍然相同的异常?
    • @steve:你需要使用RSA作为算法。 IE。 keytool -genkey -keyalg RSA -alias serverprivkey -keystore privateKey.store
    • ok 使用了该算法并添加到 KeyStore 仍然是相同的错误。还有其他想法吗?
    • 我添加了 ssl 进程的调试转储,有什么帮助吗?
    • @steve:目前尚不清楚,您何时收到异常,因为您的密钥库似乎已加载。您可以复制粘贴所有 ssl 流程和异常吗?
    【解决方案2】:

    史蒂夫,如果您只需要检查流量,就不必重新发明轮子。使用 Paros 等现有的代理服务器之一来观察流量。

    【讨论】:

    • 我需要重新发明轮子。我想创建自己的代理,不仅要学习这个过程,而且需要进行特定的自定义。我非常熟悉 burp、paros、fiddler、zap 等。这肯定是努力使这项工作成长的痛苦。我现在可以通过 http 让一切正常工作。为什么他们让 SSL 如此难以使用。我对 java 的一大抱怨!
    【解决方案3】:

    我通常希望在“C:\Program Files\Java\jre6\lib\security”下找到 cacerts。您的程序正在“C:\Program Files\Java\jre6\bin”中寻找它。

    【讨论】:

      猜你喜欢
      • 2013-04-10
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-24
      • 1970-01-01
      相关资源
      最近更新 更多