2009-07-24 172 views
42

我有一個運行自簽名SSL證書的Apache Tomcat 6.x服務器。我希望客戶端將自己的證書提交給服務器,以便我可以基於用戶數據庫對其進行身份驗證。我基於我在網上找到的一個例子開展工作,但這個例子帶有罐裝證書和一個預先構建的JKS數據存儲。我想用自己的證書創建自己的數據存儲區,但沒有運氣。Tomcat服務器/客戶端自簽名SSL證書

如何爲Tomcat創建數據存儲?
如何爲Tomcat創建自簽名證書?

如何爲客戶端創建自簽名證書?
如何強制Tomcat信任客戶端的簽名?

我一直在玩java keytool好幾個小時了。

回答

59

終於得到了解決我的問題,因此,如果任何人卡住我會在這裏發佈結果。的Michael's Software Thoughts & Ramblings

感謝邁克爾·馬丁,我發現:

密鑰工具默認使用DSA 算法生成 自簽名證書時。 的早期版本Firefox接受這些密鑰而沒有 問題。使用Firefox 3 beta 5,使用 DSA不起作用,但使用RSA。 生成 當自簽名證書創建一個證書 火狐3測試版5完全 接受傳遞「-keyalg RSA」。

我只是設置該標誌,清除所有在FireFox中的緩存,它的工作就像一個魅力!我使用這個作爲我的項目的測試設置,我需要與其他人分享,所以我寫了一個創建兩個SSL證書的小批處理腳本。一個可以放入Tomcat設置中,另一個可以導入到FireFox/IE中。謝謝!

用法:第一命令行參數是在客戶端的用戶名。所有密碼都是「密碼」(不含引號)。更改任何硬編碼位以滿足您的需求。

@echo off 
if "%1" == "" goto usage 

keytool -genkeypair -alias servercert -keyalg RSA -dname "CN=Web Server,OU=Unit,O=Organization,L=City,S=State,C=US" -keypass password -keystore server.jks -storepass password 
keytool -genkeypair -alias %1 -keystore %1.p12 -storetype pkcs12 -keyalg RSA -dname "CN=%1,OU=Unit,O=Organization,L=City,S=State,C=US" -keypass password -storepass password 
keytool -exportcert -alias %1 -file %1.cer -keystore %1.p12 -storetype pkcs12 -storepass password 
keytool -importcert -keystore server.jks -alias %1 -file %1.cer -v -trustcacerts -noprompt -storepass password 
keytool -list -v -keystore server.jks -storepass password 
del %1.cer 
goto end 

:usage 
echo Need user id as first argument: generate_keystore [username] 
goto end 

:end 
pause 

結果是兩個文件。一個名爲server.jks的文件放入Tomcat,另一個名爲{username} .p12的文件導入瀏覽器。 server.jks文件將客戶證書添加爲可信證書。

我希望別人認爲這很有用。

這裏是需要被添加到您的Tomcat的conf/sever.xml文件(僅在Tomcat 6.x的測試上)

<Connector 
    clientAuth="true" port="8443" minSpareThreads="5" maxSpareThreads="75" 
    enableLookups="true" disableUploadTimeout="true" 
    acceptCount="100" maxThreads="200" 
    scheme="https" secure="true" SSLEnabled="true" 
    keystoreFile="${catalina.home}/conf/server.jks" 
    keystoreType="JKS" keystorePass="password" 
    truststoreFile="${catalina.home}/conf/server.jks" 
    truststoreType="JKS" truststorePass="password" 
    SSLVerifyClient="require" SSLEngine="on" SSLVerifyDepth="2" sslProtocol="TLS" 
/> 

對於Tomcat 7的XML:

<Connector protocol="org.apache.coyote.http11.Http11NioProtocol" 
      port="8443" SSLEnabled="true" 
      maxThreads="200" scheme="https" secure="true" 
      keystoreFile="${catalina.base}/conf/server.jks" keystorePass="password" 
      clientAuth="false" sslProtocol="TLS" />  
+1

非常感謝這個!我已經被各種各樣的「教程」整天鬼混,這實際上與clientAuth =工作爲先「的真「 – 2009-12-09 19:05:31

2

創建證書:

keytool -genkey -alias tomcat -keyalg RSA -keystore /home/bob/mykeystore 

輸入的所有數據,你需要那麼SSL連接器上編輯Tomcat的server.xml中指定密鑰庫屬性的自簽名證書,如:

<Connector port="8443" maxHttpHeaderSize="8192" 
     maxThreads="150" minSpareThreads="25" maxSpareThreads="75" 
     enableLookups="false" disableUploadTimeout="true" 
     acceptCount="100" scheme="https" secure="true" 
     keystoreFile="/home/bob/mykeystore" 
     clientAuth="false" sslProtocol="TLS" /> 

或按照Tomcat文檔...

http://tomcat.apache.org/tomcat-6.0-doc/ssl-howto.html

+3

我看到前面,它得到了我一半的答案,但是你錯過更棘手的部分。我如何使用自簽名客戶端證書? 在您提供的示例中,它表示「clientAuth ='false'。」 「 」如果您希望Tomcat要求所有SSL客戶端提供客戶端證書才能使用此套接字,請將此值設置爲true。「 這就是我想要的。但是,我不能讓服務器接受客戶端的自簽名的證書。 – davidemm 2009-07-24 23:13:37

3

要啓用客戶端驗證,你需要指定一個「信任存儲」爲Tomcat:包含從根證書頒發機構的證書密鑰存儲,你放心,每個標記爲「trustEntry」。

這由Connector元素的屬性指定:truststoreFiletruststorePass(默認爲的keystorePass的值),和truststoreType(默認爲「JKS」)。

如果一個客戶端使用自簽名證書,那麼它的「根」 CA的證書本身;那麼你需要將客戶的自簽名證書導入到Tomcat的信任存儲中。

如果你有很多客戶,這將很快成爲一個麻煩。在這種情況下,您可能需要考慮爲客戶簽署證書。 Java keytool命令無法執行此操作,但OpenSSL中提供了所有必需的命令行實用程序。或者你可以大規模地看看EJBCA

更重要的是,讓你的客戶使用現有的免費CA,像startcom.org。這並不總是適用於服務器證書,因爲StartCom的證書不包含在所有瀏覽器中,但這種情況相反,並且StartCom根證書可以輕鬆導入到Tomcat信任庫中。

1

以前的答案對我很有用,但沒有shell工具版本。所以我寫了一個。

key_gen.sh:

#! /bin/bash 
# a key generator for https, 

basename=server 
key_algorithm=RSA 
password_key=123456 
password_store=123456 
country=US 

# clean - pre 
rm "${basename}.jks" 

# generate server side 
keytool -genkeypair -alias "${basename}cert" -keyalg $key_algorithm -dname "CN=Web Server,OU=Unit,O=Organization,L=City,S=State,C=${country}" -keypass $password_key -keystore "${basename}.jks" -storepass $password_store 

tomcat8,可以以下配置添加到server.xml

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" 
     maxThreads="150" SSLEnabled="true" scheme="https" secure="true" 
     clientAuth="false" sslProtocol="TLS" 
     acceptCount="75" keystoreFile="${catalina.home}/conf/server.jks" keystorePass="123456" 
    /> 
相關問題