在Jetty上配置SSL

时间:2010-10-24 15:20:35

标签: ssl jetty

我正在尝试在我的Jetty上配置SSL。

我读到了这个: http://docs.codehaus.org/display/JETTY/How+to+configure+SSL  并创建了一个密钥库。

然后,我直接跳到第4节。但是这个配置文件在哪里我应该配置Jetty?

我试图搜索jetty.xml,但我的计算机上没有这样的...

6 个答案:

答案 0 :(得分:39)

我在制作它时遇到了很多问题,但我最终还是知道如何让它发生。我正在使用ubuntu 10.04和java 7.它可能在windows下执行但是所有命令行都是bash命令,也许可以用cigwin / mingw做同样的事情

我使用了Jetty 8.1.8。从codehaus下载并选择linux的.tar.gz文件(.zip for windows)。

将文件解压缩到您希望的任何目录中,为了本文/答案,这将是您的{jetty}主文件夹。

转到 {jetty} / etc 目录。

按顺序执行以下所有命令行。无论何时询问密码,都要始终输入相同的密码。密码用于保护密钥文件,密钥库和证书本身。有时,将要求密码解锁密钥库或使用生成的密钥。一旦您了解了所有内容以及如何正确使用密码,您可以在准备就绪时更改这些密码(生产使用更安全)。否则,在询问时输入所请求的信息。

openssl genrsa -des3 -out jetty.key
openssl req -new -x509 -key jetty.key -out jetty.crt
keytool -keystore keystore -import -alias jetty -file jetty.crt -trustcacerts
openssl req -new -key jetty.key -out jetty.csr
openssl pkcs12 -inkey jetty.key -in jetty.crt -export -out jetty.pkcs12
keytool -importkeystore -srckeystore jetty.pkcs12 -srcstoretype PKCS12 -destkeystore keystore

现在您必须编辑 {jetty} /etc/jetty-ssl.xml 并配置您的密码以匹配您在证书生成期间使用的密码。如果要混淆密码,请返回命令行。转到 {jetty} 主目录并执行以下命令:

java -cp lib/jetty-util-8.1.8.v20121106.jar org.eclipse.jetty.util.security.Password "{PASSWORD}"

更改 {PASSWORD} 以获取实际密码,然后更改模糊密码,包括 jetty-ssl.xml 中所有密码字段中的“OBF:”。请注意,像这样模糊的密码很难为人类阅读,但很容易以编程方式未被删除。它只是阻止开发人员在编辑文件时知道密码。应正确保护所有配置文件,并尽可能限制其访问。

编辑 {jetty} /start.ini 并取消注释#etc / jetty-ssl.xml 行(只需删除

启动码头:

java -jar start.jar

现在通过以下网址与您的服务器联系:https://localhost:8443

完成!

请注意,此答案是使用jetty启用SSL的快速方法。为了确保生产安全,您必须阅读更多有关该主题的内容。

答案 1 :(得分:24)

在获得有关密钥库的更多经验后更新了答案。我向您保证,此解决方案可与中间证书完美配合(2015年7月29日)。

注意:PEM格式表示可读文件,证书以---BEGIN CERTIFICATE---开头,私钥以-----BEGIN PRIVATE KEY-----行开头。

这是一个简单的分步指南。从空目录开始 如果您有私钥(PEM编码.key),请跳至步骤2 如果您有证书签名请求(PEM编码.csr),请跳至步骤3 如果您有证书(PEM编码.crt或.pem)

,请跳至步骤4
  1. 准备(无密码)私钥。

    openssl genrsa -des3 -passout pass:1 -out domain.pass.key 2048
    openssl rsa -passin pass:1 -in domain.pass.key -out domain.key
    rm domain.pass.key
    
  2. 准备证书签名请求(CSR)。我们将使用我们的密钥生成此信息。询问时输入相关信息。请注意-sha256的使用,如果没有它,现代浏览器将生成警告。

    openssl req -key domain.key -sha256 -new -out domain.csr
    
  3. 准备证书。选择一个:

    a)自己签名

    openssl x509 -req -days 3650 -in domain.csr -signkey domain.key -out domain.crt
    

    b)将其发送给权威机构

    您的SSL提供商将以PEM格式为您提供证书及其中间证书。

  4. 添加到信任链并以PKCS12格式打包。为方便起见,第一个命令设置密钥库密码(否则您需要输入密码十几次)。为安全设置不同的密码。

    export PASS=LW33Lk714l9l8Iv
    

    选择一个:

    a)自签名证书(无需中间证书)

    openssl pkcs12 -export -in domain.crt -inkey domain.key -out domain.p12 -name domain -passout pass:$PASS
    keytool -importkeystore -deststorepass $PASS -destkeypass $PASS -destkeystore domain.keystore -srckeystore domain.p12 -srcstoretype PKCS12 -srcstorepass $PASS -alias domain
    

    b)需要包含中间证书

    下载中间证书并将其连接到一个文件中。订单应该是sub to root。

    cat sub.class1.server.ca.pem ca.pem > ca_chain.pem
    

    对链文件中的每个中间证书使用-caname参数,分别与它们放入链文件的顺序相对应。

    openssl pkcs12 -export -in domain.crt -inkey domain.key -out domain.p12 -name domain -passout pass:$PASS -CAfile ca_chain.pem -caname sub1 -caname root -chain
    keytool -importkeystore -deststorepass $PASS -destkeypass $PASS -destkeystore domain.keystore -srckeystore domain.p12 -srcstoretype PKCS12 -srcstorepass $PASS -alias domain
    

    重要提示:虽然keytool -list只会列出一个条目而不是任何中间证书,但它会完美运行。

  5. 配置码头。

    domain.keystore文件移至JETTY_HOME / etc /。

    选择一个:

    a)您正在使用新的start.ini样式配置(Jetty 8+):

    jetty.keystore=etc/domain.keystore
    jetty.truststore=etc/domain.keystore
    jetty.keystore.password=LW33Lk714l9l8Iv
    jetty.keymanager.password=LW33Lk714l9l8Iv
    jetty.truststore.password=LW33Lk714l9l8Iv
    

    b)您正在使用.xml文件的旧样式配置(您应该升级到新样式!):

    修改JETTY_HOME/etc/jetty-ssl.xml文件并更改以下部分。替换密码部分以匹配您的密码。我们没有定义KeyManagerPassword,因为我们的密钥没有密码。

    <Configure id="Server" class="org.eclipse.jetty.server.Server">
      <New id="sslContextFactory" class="org.eclipse.jetty.http.ssl.SslContextFactory">
        <Set name="KeyStore"><Property name="jetty.home" default="." />/etc/keystore</Set>
        <Set name="KeyStorePassword">LW33Lk714l9l8Iv</Set>
        <Set name="TrustStore"><Property name="jetty.home" default="." />/etc/keystore</Set>
        <Set name="TrustStorePassword">LW33Lk714l9l8Iv</Set>
      </New>
      <Call name="addConnector">...</Call>
    </Configure>
    

    编辑start.ini文件以包含jetty-ssl.xml文件。

  6. (重新)启动码头。

  7. 请注意,此密钥库文件也可以与其他容器(如Tomcat)一起使用。祝好运!

答案 2 :(得分:2)

Jetty的默认配置文件,位于$JETTY_HOME/etc/jetty.xml

如果您使用的是maven的jetty插件,则需要在pom.xml文件中指定ssl密钥库详细信息。有关详细信息,请参阅this question

答案 3 :(得分:2)

刚刚以每年6美元的价格购买了godaddy的证书。很棒,而且持续时间很长。以下是我根据这些网站和Jean-Philippe Gravel的回答在Amazon EC2 / Ubuntu / Jetty上设置的步骤。

http://docs.codehaus.org/display/JETTY/How+to+configure+SSL

http://community.xmatters.com/docs/DOC-1228#.UgWsI1MU7lc

keytool -keystore keystore -alias jettykey -genkey -keyalg RSA

请注意,“名字和姓氏”必须是您的FQDN(不含http://)。在我的第一次尝试中,我尽职尽责地说出了我的名字和姓氏,但是godaddy有很好的警告而拒绝了它。

为Godaddy生成CSR文件:

keytool -certreq -alias jetty -keystore keystore -file jetty.csr

以Godaddy表格提交,以创建证书,包括BEGIN / END“新证书请求”。

(Godaddy要求你验证它的网站。有几种方法,因为我通过代理购买了域名,我发现通过托管由godaddy生成的html页面进行验证是最容易和最快的。)

从godaddy下载包含证书和中间证书的zip。有一个服务器类型列表可供选择。我选择“其他”。然后将证书与中间证书结合起来。

cat mydomain.com.crt gd_bundle.crt > certchain.txt

导出我的私钥

keytool -importkeystore -srckeystore keystore -destkeystore intermediate.p12 -deststoretype PKCS12
openssl pkcs12 -in intermediate.p12 -out jettykey.pem -nodes

合并私钥和证书

openssl pkcs12 -export -inkey jettykey.pem -in certchain.txt -out jetty.pkcs12

导入pkcs12证书(别名变为1)

keytool -importkeystore -srckeystore jetty.pkcs12 -srcstoretype PKCS12 -destkeystore keystore

(我备份了密钥库,然后删除了原始密钥。我在进行故障排除时这样做了,Jetty可能需要也可能不需要。)

keytool -delete  -keystore keystore -alias jettykey

sudo cp keystore /usr/share/jetty/etc/

sudo vi /usr/share/jetty/etc/jetty-ssl.xml

相应地修改your.store.password,your.key.password和your.trust.password。如果要对其进行模糊处理,请使用

java -cp /usr/share/jetty/lib/jetty.jar:/usr/share/jetty/lib/jetty-util.jar org.mortbay.jetty.security.Password <your.password>

指示Jetty加载jetty-ssl.xml文件。

sudo echo "/etc/jetty/jetty-ssl.xml" >> /etc/jetty/jetty.conf

sudo /sbin/iptables -t nat -I PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443

(同时修改Amazon EC2安全组以允许443)

sudo service jetty start

答案 4 :(得分:1)

如果您碰巧使用Jetty 9.3,则应更改start.d/ssl.ini中的配置:

jetty.sslContext.keyStorePath=mystore.jks
jetty.sslContext.keyStorePassword=X
jetty.sslContext.keyManagerPassword=X
jetty.sslContext.trustStorePath=mystore.jks
jetty.sslContext.trustStorePassword=X

其中:

  • mystore.jks是使用keytool
  • 生成的商店
  • X是您的明文密码(我建议跳过混淆,因为它只会给您带来虚假的安全性)

商店与为Tomcat生成的商店完全相同。即使您使用不同的Java版本来生成不应该成为问题的密钥库。

答案 5 :(得分:0)

在使用Jetty作为Maven插件的Windows上尝试时,以下步骤可以提供帮助:

pom.xml

<plugin>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <version>8.1.11.v20130520</version>
    <configuration>
        <scanIntervalSeconds>10</scanIntervalSeconds>
        <webApp>
            <contextPath>/yourappcontext</contextPath>
        </webApp>
        <connectors>
            <connector implementation="org.eclipse.jetty.server.nio.SelectChannelConnector">
                <port>9090</port>
                <maxIdleTime>1</maxIdleTime>
            </connector>
            <connector implementation="org.eclipse.jetty.server.ssl.SslSocketConnector">
                <port>9443</port>
                <keystore>src/test/resources/keystore</keystore>
                <keyPassword>123456</keyPassword>
                <password>123456</password>
            </connector>
        </connectors>
    </configuration>
</plugin>

使用JDK工具生成密钥/证书keytool

keytool -keystore keystore -alias jetty -genkey -keyalg RSA

此命令将生成一个文件keystore,我们需要将其放在以下(或任何您喜欢的文件,直到在keystore元素中配置)路径src/test/resources/keystore