根据客户端提供不同的ssl-certs

时间:2013-03-22 16:10:24

标签: java ssl sbt artifactory

我正在使用startssl.com的免费SSL证书作为我的Artifactory-repo。它在我的浏览器中都是绿色和漂亮的,但当然不是来自Java。所以我用这个方便的脚本安装了cacerts:

http://www.ailis.de/~k/uploads/scripts/import-startssl

但我仍然得到:

Server access Error: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException

错误。 JAVA_HOME设置正确。任何建议都非常感谢!

更多信息:

来自SBT 0.12.2的Ivy(使用pualp的脚本https://github.com/paulp/sbt-extras)正在对证书进行抨击:

[info] Resolving net.liftmodules#omniauth_2.10;2.5-SNAPSHOT-0.7-SNAPSHOT ...
[error] Server access Error: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target url=https://repo.woodenstake.se/all/net/liftmodules/omniauth_2.10/2.5-SNAPSHOT-0.7-SNAPSHOT/maven-metadata.xml

- 更新:

这个问题似乎与Java本身无关。从浏览器访问该页面会产生绿色证书,我可以看到它从StartSSL签名的信息。但即使是傻瓜或卷曲的窒息,并告诉我这是一个自签名的证书。似乎根据客户提供不同的证书。

repo位于https://repo.woodenstake.se/ - 如果您将其粘贴到浏览器中,我猜您会获得StartSSL证书。但是如果你做了https://repo.woodenstake.se/ wget {{3}},你会得到一些旧的自签名证书,我不知道它来自哪里。

- 更新更新:

所以问题是我正在提供* .woodenstake.se形式的一些网站。我觉得有可能有​​不同的证书,如:

server {
    listen 443;
    server_name site1.woodenstake.se;
    client_max_body_size 512m;
    ssl on;
    ssl_certificate cert1.crt;
    ssl_certificate_key cert1.key;
    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        if (!-f $request_filename) {
            proxy_pass http://server1;
            break;
        }
    }
}

server {
    listen 443;
    server_name site2.woodenstake.se;
    client_max_body_size 512m;
    ssl on;
    ssl_certificate cert2.crt;
    ssl_certificate_key cert2.key;
    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        if (!-f $request_filename) {
            proxy_pass http://server2;
            break;
        }
    }
}

它在我的所有浏览器中都运行良好。

但是,它不适用于wget或JDK6。

1 个答案:

答案 0 :(得分:2)

问题完全不同。显然,您不能在同一个IP上拥有多个证书,并确保所有客户端都可以处理它。我在这台机器上有一些工具,我的nginx-config既引用了本网站的StartSSL证书,也引用了其他一些网站的自签名(snakeoil)证书。

我的nginx支持TLS SNI:

~ $ sudo nginx -V
nginx version: nginx/0.7.65
TLS SNI support enabled

但显然wget和Java客户端无法处理它。我的所有浏览器都可以。

也许可以做类似的事情:

http://library.linode.com/security/ssl-certificates/subject-alternate-names

但我不知道是否可以让StartSSL签名。

更多信息:

http://www.carloscastillo.com.ar/2011/05/multiple-ssl-certificates-on-same-ip.html

在我的Ubuntu桌面上进行Wget测试:

viktor@hedefalk-i7:~$ wget https://bob.sni.velox.ch/
--2013-03-25 17:07:19--  https://bob.sni.velox.ch/
Resolving bob.sni.velox.ch (bob.sni.velox.ch)... 62.75.148.60
Connecting to bob.sni.velox.ch (bob.sni.velox.ch)|62.75.148.60|:443... connected.
ERROR: no certificate subject alternative name matches
    requested host name `bob.sni.velox.ch'.
To connect to bob.sni.velox.ch insecurely, use `--no-check-certificate'

所以我认为我的问题的答案是

您的Java版本(或所有版本,但可能在JDK7中运行:http://docs.oracle.com/javase/7/docs/technotes/guides/security/enhancements-7.html)不支持TLS SNI,因此nginx无法确定要在http之前协商哪个证书。从这个男人那里购买一张真钱游戏,或者在河里哭泣。