Tomcat:为https安装LetsEncrypt证书,无法正常工作

时间:2016-04-28 13:21:13

标签: java apache tomcat ssl

我在我们的服务器上运行了一个Apache Tomcat实例,我正在尝试将LetsEncrypt用于https。我找到了一些导入证书的脚本,我可以在密钥库中检查证书是否已导入。

不幸的是,https无效。每当我尝试连接时,它就会一直等待(进度条旋转)。我不知道自己做错了什么。

脚本:

cd /var/git/letsencrypt
#git pull origin master
iptables -I INPUT -p tcp -m tcp --dport 9999 -j ACCEPT
iptables -t nat -I PREROUTING -i $networkdevice -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 9999

./letsencrypt-auto certonly --standalone --test-cert --break-my-certs -d $mydomain --renew-by-default --email $myemail --agree-tos


iptables -t nat -D PREROUTING -i $networkdevice -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 9999
iptables -D INPUT -p tcp -m tcp --dport 9999 -j ACCEPT

$keytooldir/keytool -delete -alias root -storepass NEWPASS -keystore $keystoredir
$keytooldir/keytool -delete -alias tomcat -storepass NEWPASS -keystore $keystoredir

openssl pkcs12 -export -in $certdir/fullchain.pem -inkey $certdir/privkey.pem -out $certdir/cert_and_key.p12 -name tomcat -CAfile $certdir/chain.pem -caname root -password pass:aaa

$keytooldir/keytool -importkeystore -srcstorepass aaa -deststorepass NEWPASS -destkeypass changeit -srckeystore $certdir/cert_and_key.p12 -srcstoretype PKCS12 -alias tomcat -keystore $keystoredir
$keytooldir/keytool -import -trustcacerts -alias root -deststorepass NEWPASS -file $certdir/chain.pem -noprompt -keystore $keystoredir

输出:

iptables v1.4.21: can't initialize iptables table `nat': Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.
Checking for new version...
Requesting root privileges to run letsencrypt...

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/domina-name/fullchain.pem.
   Your cert will expire on 2016-07-27. To obtain a new version of the
   certificate in the future, simply run Let's Encrypt again.
iptables v1.4.21: can't initialize iptables table `nat': Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.
Certificate was added to keystore

Apache tomcat连接器:

 <Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" SSLEnabled="true" maxThreads="200"
              scheme="https" secure="true" clientAuth="false"  sslProtocol="TLS"
                keystoreFile="/root/.keystore" keystorePass="newPASS" />

OpenSSL连接输出:

openssl s_client -connect domain_name.de:443
CONNECTED(00000003)

它被困在连接处。

我做错了什么。有任何想法吗?谢谢。

更新

当我检查时,我得到了一个无法恢复的关键异常。我认为这可能是因为Tomcat需要Key-pass,所以我使用以下命令更改了密钥的密码,但仍然会出现错误:

openssl rsa -aes192 -in yourprivatekeywithoutpassword.pem -out newprivatekeywithpassword.pem

错误日志:

SEVERE: Failed to initialize end point associated with ProtocolHandler ["http-nio-443"]
java.security.UnrecoverableKeyException: Cannot recover key
        at sun.security.provider.KeyProtector.recover(KeyProtector.java:328)
        at sun.security.provider.JavaKeyStore.engineGetKey(JavaKeyStore.java:146)
        at sun.security.provider.JavaKeyStore$JKS.engineGetKey(JavaKeyStore.java:56)
        at sun.security.provider.KeyStoreDelegator.engineGetKey(KeyStoreDelegator.java:96)
        at sun.security.provider.JavaKeyStore$DualFormatJKS.engineGetKey(JavaKeyStore.java:70)
        at java.security.KeyStore.getKey(KeyStore.java:1023)
        at sun.security.ssl.SunX509KeyManagerImpl.<init>(SunX509KeyManagerImpl.java:133)
        at sun.security.ssl.KeyManagerFactoryImpl$SunX509.engineInit(KeyManagerFactoryImpl.java:70)
        at javax.net.ssl.KeyManagerFactory.init(KeyManagerFactory.java:256)

3 个答案:

答案 0 :(得分:3)

我终于能够通过更改从中检索证书的服务器URL来解决此问题。如您所见,我收到的错误是证书不受信任。发生这种情况是因为证书来自登台服务器。

我在更新时使用server参数更改了配置文件

https://acme-v01.api.letsencrypt.org/directory

之后,我从letsEncrypt中检索了所有证书,并再次安装它们。

输出:

openssl s_client -connect domain.de:443
CONNECTED(00000003)
depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify return:1
depth=0 CN = domain.de
verify return:1
---
  Verify return code: 0 (ok)

此问题在此解决并完成。感谢您的时间。

答案 1 :(得分:1)

我唯一能想到的是你有一个不同的keystorePass和keyPass,而不在连接器上提供keyPass。 Tomcat尝试使用与密钥库相同的密码访问密钥,失败并产生您看到的错误。

在您的更新中,您更新了pem文件;你是否将它导入密钥库以更新tomcat正在使用的内容?我假设你做了,但必须要求完整性。如果没有,则密钥密码更改不会对tomcat正在使用的密钥库执行任何操作。

我能提供的唯一解决方案是将keyPass属性添加到连接器以查看是否有效。我在本地测试并且使用不同的密钥库和密钥密码确实会产生错误。将keyPass添加到连接器可以解决我的问题。

答案 2 :(得分:1)

对于你的问题,我想模块化你的问题。

首先,

  

iptables v1.4.21:无法初始化iptables表`nat&#39;:表没有   不存在(你需要insmod吗?)也许iptables或你的内核   需要升级。

对于这个问题,可以通过更改ip_tables位置来解决。命令如下所示:

sudo modprobe ip_tables
sudo echo 'ip_tables' >> /etc/modules

有关完整部分,您可以浏览此链接:iptables: Table does not exist (do you need to insmod?)

资源链接:

  1. iptables v1.4.14: can't initialize iptables table `nat': Table does not exist (do you need to insmod?)
  2. iptables nat does not exist
  3. 其次,我想修复

    部分
      

    java.security.UnrecoverableKeyException:无法恢复密钥

    当keymanager使用错误/错误的密码实际上不匹配或有时大写的小写问题或您的密钥库可能已损坏时,实际发生此问题。 您必须确保KeyStore密码和密钥密码相同

    为此你可以通过2种方式检查 -

    You can change/list the key in keytool with the same password or another

    keytool -keypasswd -new changeit -keystore cacerts -storepass changeit -alias someapp -keypass password
    

    上面的示例将密码从密码更改为changeit。如果私钥密码是密码,则此命令将成功。

    您也可以使用别名。您需要在自定义X509KeyManager中实现getPrivateKey(String alias)才能将其考虑在内。特别是,它必须使用每个别名的正确密码从KeyStore实例加载密钥(请参阅getKey(String alias, char[] password))。

    归功于@ bruno

    接着,

    我看到的另一件事是,您在命令模式下有时使用NEWPASS,在tomcat连接器中使用newPASS作为密码。希望有一些不匹配。请检查并验证。

    Tomcat Recommendation for preparing the certificate keystore:

      

    Tomcat使用的默认密码是&#34; changeit&#34; (全部小写),   虽然您可以根据需要指定自定义密码。你也会   需要在server.xml配置中指定自定义密码   文件

         

    您必须在此处使用与密钥库相同的密码   密码本身。这是对Tomcat实现的限制。

         

    port属性是Tomcat将使用的TCP / IP端口号   听取安全的连接。您可以将其更改为任何端口号   你希望(例如https通信的默认端口,哪个   是443)。但是,特殊设置(本文档范围之外)   在很多端口号上运行Tomcat是必要的   操作系统。

         

    完成配置更改后,必须重新启动Tomcat

    您还可以浏览SSL Support

    资源链接:

    1. Can not get key from KeyStore
    2. UPDATE:

      如果第一部分无法正常运行,请按照下面的@ douglas's服务提供商的说法进行操作:

        

      这是我们使用的虚拟化系统(OpenVZ)的限制,   可以使用基本的iptables规则,但不能使用nat表。

           

      如果确实存在问题,我们可以为您提供迁移到其他服务的权限   我们开始为客户提供系统虚拟化(KVM)。

      所以你必须将服务器迁移到新系统。如果可能的话,你可以尝试一下。