Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Tomcat:正在安装https的LetsEncrypt证书,不起作用_Java_Apache_Tomcat_Ssl - Fatal编程技术网

Java Tomcat:正在安装https的LetsEncrypt证书,不起作用

Java Tomcat:正在安装https的LetsEncrypt证书,不起作用,java,apache,tomcat,ssl,Java,Apache,Tomcat,Ssl,我在我们的服务器上运行了一个ApacheTomcat实例,我正在尝试将LetsEncrypt用于https。我找到了一些导入证书的脚本,我可以在密钥库中检查证书是否已导入 不幸的是,https不起作用。每当我尝试连接时,它总是在等待(进度条旋转)。我不知道我做错了什么 脚本: cd /var/git/letsencrypt #git pull origin master iptables -I INPUT -p tcp -m tcp --dport 9999 -j ACCEPT iptables

我在我们的服务器上运行了一个ApacheTomcat实例,我正在尝试将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
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)
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" />
它卡在已连接的位置

我做错了什么。有什么想法吗?多谢各位

更新

我检查时发现无法恢复密钥异常。我想这可能是因为Tomcat需要密钥传递,所以我用以下命令更改了密钥的密码,但错误仍然存在:

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)
SEVERE:未能初始化与ProtocolHandler[“http-nio-443”关联的端点
java.security.UnrecoverableKeyException:无法恢复密钥
位于sun.security.provider.KeyProtector.recover(KeyProtector.java:328)
位于sun.security.provider.JavaKeyStore.engineGetKey(JavaKeyStore.java:146)
位于sun.security.provider.JavaKeyStore$JKS.engineGetKey(JavaKeyStore.java:56)
位于sun.security.provider.KeyStoreDelegator.engineGetKey(KeyStoreDelegator.java:96)
位于sun.security.provider.JavaKeyStore$DualFormatJKS.engineGetKey(JavaKeyStore.java:70)
位于java.security.KeyStore.getKey(KeyStore.java:1023)
位于sun.security.ssl.SunX509KeyManagerImpl.(SunX509KeyManagerImpl.java:133)
位于sun.security.ssl.keymanagerfactorympl$SunX509.engineInit(keymanagerfactorympl.java:70)
位于javax.net.ssl.KeyManagerFactory.init(KeyManagerFactory.java:256)

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

在更新中,您更新了pem文件;您是否将其导入密钥库以更新tomcat正在使用的内容?我想是的,但必须要求完整性。如果没有,那么密钥密码更改对tomcat正在使用的密钥库没有任何影响


我能提供的唯一解决方案是将keyPass属性添加到连接器中,看看这是否有效。我在本地进行了测试,使用不同的密钥库和密钥密码确实会产生错误。向连接器添加keyPass为我解决了问题。

对于您的问题,我想模块化您的问题

一开始 iptables v1.4.21:无法初始化iptables表'nat':表无法初始化 不存在(您需要insmod吗?)可能是iptables或您的内核 需要升级

对于这个问题,可以通过改变ip_表的位置来解决。命令将如下所示:

sudo modprobe ip_tables
sudo echo 'ip_tables' >> /etc/modules
对于完整部分,您可以通过以下链接:

资源链接:

  • 其次,我想修复该部分 java.security.UnrecoverableKeyException:无法恢复密钥

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

    为此,您可以通过两种方式进行检查-

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

    也可以使用别名。您需要在自定义X509KeyManager中实现
    getPrivateKey(字符串别名)
    ,才能考虑到这一点。特别是,它必须使用每个别名的正确密码从密钥库实例加载密钥(请参阅)

    功劳归于@


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

    Tomcat使用的默认密码是“changeit”(全小写), 不过,如果愿意,可以指定自定义密码。你也会 需要在server.xml配置中指定自定义密码 文件

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

    端口属性是Tomcat将访问的TCP/IP端口号 监听安全连接。您可以将其更改为任何端口号 您希望(例如)使用https通信的默认端口 是443)。但是,特殊设置(不在本文件范围内) 在许多情况下,必须在小于1024的端口号上运行Tomcat 操作系统

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

    你也可以通过

    资源链接:

  • 更新: 如果第一部分工作不正常,则按照@service provider的回答如下:

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

    如果这确实是一个问题,我们可以为您提供迁移到其他服务器的服务 随着我们开始向客户提供系统虚拟化(KVM)


    因此,您必须将服务器迁移到新系统。如果可能的话,您可以试试。

    我终于能够通过更改从中检索证书的服务器URL来解决这个问题。正如您所看到的,我收到一个错误,证书不可信。发生这种情况是因为证书来自临时服务器

    我将更新中带有
    server
    参数的配置文件更改为

    https://acme-v01.api.letsencrypt.org/directory
    
    之后,我从letsEncrypt检索了所有证书,并再次安装了它们

    输出:

    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
    
    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)
    
    这个问题就此解决并完成。谢谢你抽出时间

    如果你愿意,我会很高兴的