2010-10-24 135 views
28

我正在嘗試在Jetty上配置SSL。在Jetty上配置SSL

我看了這個: http://docs.codehaus.org/display/JETTY/How+to+configure+SSL 並創建了一個密鑰存儲。

然後,我直接跳到第4節。但是,這個配置文件的位置應該配置Jetty嗎?

我試圖檢索算法進行的jetty.xml,但目前還沒有這樣的我的電腦上...

+1

對於任何需要更新文檔的人來說,鏈接都在這裏:http://www.eclipse.org/jetty/documentation/current/configuring-ssl.html – 2016-01-21 12:11:23

回答

2

的碼頭有默認的配置文件,位於$JETTY_HOME/etc/jetty.xml

如果您正在使用Maven的碼頭插件您需要在您的pom.xml文件中指定ssl密鑰庫詳細信息。詳情請見this question

+0

我們這裏有一個配置文件。我們啓動服務器,讀取pcjetty.xml配置文件,然後配置並啓動jetty(作爲我們的Java代碼的一部分) – Yura 2010-10-25 11:23:35

+0

我嘗試將此:http://wiki.eclipse.org/Jetty/Reference/SSL_Connectors部分添加到pcjetty。 xml文件,但它會在啓動時引發異常。我真的不明白這個部分做什麼,它應該配置...你可以幫忙嗎? – Yura 2010-10-25 11:25:10

+0

如果您在/ etc目錄中看不到jetty.xml文件,請嘗試創建一個,或許它會解決您的問題 – Sorantis 2010-10-25 17:09:38

36

我有很多問題使它工作,但我終於找到了如何使它發生。我使用的是Java 7的Ubuntu 10.04。它可能會在Windows下執行,但所有的命令行都是bash命令,也許可以用cigwin/mingw做同樣的事情。

我使用的是Jetty 8.1.8。從codehaus下載並選擇linux的.tar.gz文件(windows的.zip文件)。

將文件解壓縮到您希望的任何目錄中,這將是您的{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 

現在你必須編輯{}碼頭/etc/jetty-ssl.xml和配置您的密碼,以匹配證書生成過程中使用的一個。如果您想混淆密碼,請返回到命令行。去壽你{碼頭}主目錄,並執行以下命令:

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

變化{PASSWORD}爲您的實際密碼,然後經過模糊處理的密碼,包括「OBF:」在中找到的所有密碼字段jetty-ssl.xml。請注意,像這樣混淆的密碼很難被人讀取,但很容易以編程方式未被瀏覽。它只是防止開發人員在編輯文件時知道密碼。所有的配置文件都應該被正確地保護,並且他們的訪問儘可能地受到限制。

編輯{碼頭} /start.ini並取消線#等/碼頭-ssl.xml(只是刪除)。

開始碼頭:

java -jar start.jar 

現在在聯繫您的服務器:https://localhost:8443

完成!

請注意,此答案是啓用SSL與碼頭的快速方法。爲了保證生產的安全,您必須閱讀更多關於此主題的內容。

+1

在最後一步我得到的錯誤: 未能解密安全內容條目:javax.crypto.BadPaddingException:由於最後一個塊未正確填充 在followinmg鏈路的解決方案爲我工作: http://stackoverflow.com/questions/9236939/java-keytool-giving-final-block-not-properly-padded #Remove文件創建 RM jetty.pkcs12 jetty.csr密鑰庫jetty.crt jetty.key #Repeat與修改,以在最後添加2048第一步的所有步驟,如下所示: OpenSSL的genrsa -des3 -out jetty.key 2048 此外,建議在每個步驟中添加註釋以解釋它正在做什麼。感謝您的解決方案 – 2013-05-22 15:10:58

+0

最近的jetty版本顯然不使用start.ini。而是運行下面的命令:sudo echo「/etc/jetty/jetty-ssl.xml」>> /etc/jetty/jetty.conf – 2013-08-10 15:49:58

0

在Windows與碼頭試圖作爲Maven插件以下步驟可以幫助:

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

2

剛剛從godaddy購買的證書只有6美元/年。它持續很長時間。以下是我根據這些網站和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有很好的警告並拒絕了它。

生成CSR文件的Godaddy:

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

在Godaddy的形式提交該創建證書,其中包括開始/結束 「NEW CERTIFICATE REQUEST」。

(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 

(我備份keystore然後刪除t他原來的鑰匙。我這樣做,同時故障,這可能會或可能不會被要求碼頭)

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 
20

答案後,用密鑰存儲更多的經驗更新。我向你保證,這個解決方案可以與中間證書完美配合(29/07/2015)。

注意:PEM格式表示可讀文件,證書以---BEGIN CERTIFICATE---開頭,私鑰以-----BEGIN PRIVATE KEY-----行開頭。

這是一步一步的指導。從一個空目錄開始。
跳到步驟2,如果你有私鑰(PEM編碼.KEY)
跳到第3步,如果你有證書籤名請求(PEM編碼的.csr)
跳到步驟4,如果你有你的證書(PEM編碼。 crt或.pem)

  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. 準備證書。選擇一個:

    一)自己註冊它

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

    二)把它寄給你的權威

    你的SSL提供商將提供您與您的證書和PEM格式的中間證書。

  4. 添加到信任鏈並將其打包爲PKCS12格式。第一條命令爲方便起見設置密鑰庫密碼(否則,您需要輸入密碼十幾次)。爲安全起見設置不同的密碼。

    export PASS=LW33Lk714l9l8Iv 
    

    選擇一個:

    一)自簽名證書(無需中間證書)

    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 
    

    二)需要包括中間證書

    下載中間證書和CONCAT他們成一個文件。順序應該是根源。

    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風格的配置(碼頭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. (Re)start jetty。

請注意,此密鑰庫文件也可以與其他容器(如Tomcat)一起使用。祝你好運!

+0

我遵循了所有這些步驟,但是得到'''curl localhost:8443/ curl:(52 )來自server'''的空回覆8080調用仍然正常。任何想法我錯過了什麼? – 2014-09-23 14:48:43

+1

改爲使用'curl https:// localhost:8443 /'。 – bekce 2014-10-04 20:03:21

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版本來生成不應該成爲問題的密鑰庫。

+0

在碼頭上使用ssl時,總是需要輸入密碼? (我正要嘗試導入密鑰對到我的jks中,所以我仍然需要輸入sslContext的密碼,如上所述?) – Gobliins 2017-03-29 12:08:40

+0

Jetty必須知道密碼。否則,它將無法使用證書進行加密。 – Nux 2017-03-30 12:33:08