java - 根据客户端交付不同的 ssl 证书

标签 java ssl sbt artifactory

我正在为我的 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 的 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 签名的信息。但即使是 wget 或 curl 也会窒息并告诉我这是一个自签名证书。似乎根据客户端交付了不同的证书。

存储库位于 https://repo.woodenstake.se/ - 如果您将其粘贴到您的浏览器中,我猜您会获得 StartSSL 证书。但是如果你做 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。

最佳答案

问题完全不同。显然,您不能在同一个 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 之前协商的。从该人那里用真钱购买通配符证书或哭泣。

关于java - 根据客户端交付不同的 ssl 证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15574942/

相关文章:

c# - WCF 安全连接应启动与 TLS 1.2 协议(protocol)的连接

scala - 使用 SBT,您如何在运行时执行具有不同 Setting[T] 值的任务?

java - SBT 在 jar 中包含一个二进制文件

java - liquibase - 使用java比较两个数据库后如何从变更日志生成sql脚本?

java - 如果我用Superclass来初始化一个子类对象,为什么这个对象有子类的属性却有父类的方法呢?

java - NetBeans jFrames不起作用(仅显示加载中……)

java - 使用可信证书和所有信任管理的 PKIX 路径构建失败

ssl - Hostgator 节点邮件程序 ERR_TLS_CERT_ALTNAME_INVALID

Java:如何返回 ArrayList 中的唯一元素

sbt - 使用自定义任务调用子项目的 main