Java是否支持Let';s加密证书?

Java是否支持Let';s加密证书?,java,ssl,keystore,lets-encrypt,ca,Java,Ssl,Keystore,Lets Encrypt,Ca,我正在开发一个Java应用程序,通过HTTP查询远程服务器上的RESTAPI。出于安全原因,此通信应切换到HTTPS 现在已经开始了他们的公测版,我想知道Java是否在默认情况下使用他们的证书工作(或者被确认在将来工作) 让我们得到他们的中间版本,这应该是个好消息。但是,我在该命令的输出中找不到这两个命令中的任何一个: keytool -keystore "..\lib\security\cacerts" -storepass changeit -list 我知道可以在每台机器上手动添加受信任

我正在开发一个Java应用程序,通过HTTP查询远程服务器上的RESTAPI。出于安全原因,此通信应切换到HTTPS

现在已经开始了他们的公测版,我想知道Java是否在默认情况下使用他们的证书工作(或者被确认在将来工作)

让我们得到他们的中间版本,这应该是个好消息。但是,我在该命令的输出中找不到这两个命令中的任何一个:

keytool -keystore "..\lib\security\cacerts" -storepass changeit -list

我知道可以在每台机器上手动添加受信任的CA,但由于我的应用程序应该可以免费下载和执行,而无需任何进一步的配置,因此我正在寻找“开箱即用”的解决方案。你有好消息告诉我吗?

[更新2016-06-08:根据识别,CA将包含在Oracle Java 8u101中。]

[更新2016-08-05:Java 8u101已经发布,并且确实包含Identitrust CA:]


Java支持让我们加密证书吗

对。Let's Encrypt证书只是一个常规公钥证书。Java支持它(根据,对于Java7>=7u111和Java8>=8u101)

Java信任让我们对证书进行开箱即用的加密吗

否/这取决于JVM。OracleJDK/JRE高达8u66的信任库既不包含Let's Encrypt CA,也不包含交叉签名的Identitrust CA<代码>新URL(“https://letsencrypt.org/”).openConnection().connect()导致
javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException

但是,您可以提供自己的验证器/定义包含所需根CA的自定义密钥库,或者将证书导入JVM信任库

也讨论了这个话题


下面是一些示例代码,演示如何在运行时将证书添加到默认信任库。您只需要添加证书(从firefox导出为.der并放入classpath)

基于和


我知道OP要求在不更改本地配置的情况下提供解决方案,但如果您希望将信任链永久添加到密钥库:

$ keytool -trustcacerts \
    -keystore $JAVA_HOME/jre/lib/security/cacerts \
    -storepass changeit \
    -noprompt \
    -importcert \
    -file /etc/letsencrypt/live/hostname.com/chain.pem

来源:

对于尚不支持Let's Encrypt certificates的JDK,您可以按照此过程将其添加到JDK
cacerts
(感谢)

下载上的所有证书(选择der格式),并使用此类命令逐个添加它们(例如
letsencryptoauthorityx1.der
):


对于我们这些愿意进行本地配置更改(包括备份配置文件)的人的详细回答:

1.在更改之前测试它是否工作 如果您还没有测试程序,可以使用我的java SSLPing ping程序来测试TLS握手(将与任何SSL/TLS端口一起使用,而不仅仅是HTTPS)。我将使用预构建的SSLPing.jar,但是阅读代码并自己构建它是一项快速而简单的任务:

$ git clone https://github.com/dimalinux/SSLPing.git
Cloning into 'SSLPing'...
[... output snipped ...]
由于我的Java版本早于1.8.0_101(在撰写本文时未发布),因此默认情况下,Let's Encrypt证书不会进行验证。在应用修复程序之前,让我们看看失败的情况:

$ java -jar SSLPing/dist/SSLPing.jar helloworld.letsencrypt.org 443
About to connect to 'helloworld.letsencrypt.org' on port 443
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
[... output snipped ...]

2.导入证书 我在Mac OS X上,使用JAVA_HOME环境变量集。稍后的命令将假定此变量是为您正在修改的java安装设置的:

$ echo $JAVA_HOME 
/Library/Java/JavaVirtualMachines/jdk1.8.0_92.jdk/Contents/Home/
备份我们将要修改的cacerts文件,这样您就可以在不重新安装JDK的情况下撤销任何更改:

$ sudo cp -a $JAVA_HOME/jre/lib/security/cacerts $JAVA_HOME/jre/lib/security/cacerts.orig
下载我们需要导入的签名证书:

$ wget https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.der
执行导入:

$ sudo keytool -trustcacerts -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit -noprompt -importcert -alias lets-encrypt-x3-cross-signed -file lets-encrypt-x3-cross-signed.der 
Certificate was added to keystore

3.确认更改后它是否正常工作 验证Java现在是否乐于连接到SSL端口:

$ java -jar SSLPing/dist/SSLPing.jar helloworld.letsencrypt.org 443
About to connect to 'helloworld.letsencrypt.org' on port 443
Successfully connected

还有一件事:我需要使用哪个文件?让我们对下载的优惠进行加密。我尝试了
isrgrotx1.der
lets-encrypt-x1-cross-signed.der
,但两者似乎都不正确。@Hexaholic取决于您希望信任的内容以及您使用的站点如何配置证书。转到
https://helloworld.letsencrypt.org
例如,在浏览器中检查证书链(单击绿色图标)。对于此证书,您需要站点特定的证书、X1中间证书(由IdenTrust交叉签名)或DSTRootCAX3证书。
ISRG Root X1
不适用于helloworld站点,因为它不在链(即备用链)中。我会使用DSTRoot one,只是通过浏览器导出,因为我没有看到它在任何地方下载。谢谢你的代码。不要忘记关闭keyStore.load(Files.newInputStream(ksPath))中的InputStream。@adapt dev否,为什么软件应该信任未知系统来提供良好的证书?软件需要能够信任它实际信任的证书。如果这意味着我的java程序可以为其他人的程序安装证书,那将是一个安全漏洞。但这并不是在这里发生的,代码只在自己的运行时添加了cert+1,用于显示不只是通过设置
javax.net.ssl.trustStore
系统属性进行欺骗的代码,而是-1,用于设置JVM的默认
SSLContext
。最好创建一个新的
SSLSocketFactory
,然后将其用于各种连接(例如
HttpUrlConnection
),而不是替换VM范围的SSL配置。(我意识到这种改变只对运行中的JVM有效,不会持续或影响其他程序。我只是认为明确说明配置的应用位置是更好的编程实践。)是的,OP没有要求它,但这是迄今为止对我来说最简单的解决方案!我将此证书导入到旧的Java8版本中,无法访问使用lets加密证书的web服务!这个解决方案既快速又简单,这改善了这种情况,但随后出现了连接错误:javax.net.ssl.SSLException:java.lang.Runt
$ sudo keytool -trustcacerts -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit -noprompt -importcert -alias lets-encrypt-x3-cross-signed -file lets-encrypt-x3-cross-signed.der 
Certificate was added to keystore
$ java -jar SSLPing/dist/SSLPing.jar helloworld.letsencrypt.org 443
About to connect to 'helloworld.letsencrypt.org' on port 443
Successfully connected