1

我正在为我的 Artifactory-repo 使用来自 startssl.com 的免费 SSL 证书。在我的浏览器中,一切都是绿色和漂亮的,但当然不是来自 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 的常春藤(使用 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 签名的信息。但即使是 wget 或 curl 也会窒息并告诉我这是一个自签名证书。似乎根据客户提供不同的证书。

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

-- 更新更新:

所以问题是我正在为一些 *.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。

4

1 回答 1

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 之前协商的。从那个男人那里用真钱购买通配符证书,或者大哭一场。

于 2013-03-25T16:13:34.023 回答