Java是否支持Let';s加密证书?
我正在开发一个Java应用程序,通过HTTP查询远程服务器上的RESTAPI。出于安全原因,此通信应切换到HTTPS 现在已经开始了他们的公测版,我想知道Java是否在默认情况下使用他们的证书工作(或者被确认在将来工作) 让我们得到他们的中间版本,这应该是个好消息。但是,我在该命令的输出中找不到这两个命令中的任何一个: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 我知道可以在每台机器上手动添加受信任
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