2009-07-24 51 views
42

Tôi có máy chủ Apache Tomcat 6.x đang chạy với chứng chỉ SSL tự ký. Tôi muốn khách hàng trình bày chứng chỉ của riêng họ cho máy chủ để tôi có thể xác thực chúng dựa trên cơ sở dữ liệu của người dùng. Tôi có tất cả làm việc dựa trên một ví dụ tôi tìm thấy trực tuyến, nhưng ví dụ đi kèm với giấy chứng nhận đóng hộp và một kho dữ liệu JKS dựng sẵn. Tôi muốn tạo kho dữ liệu của riêng mình với các chứng chỉ của riêng mình nhưng không có may mắn.Chứng chỉ SSL Máy chủ Tự động/Máy chủ Tomcat

Làm cách nào để tạo kho dữ liệu cho Tomcat?
Làm cách nào để tạo chứng chỉ tự ký cho Tomcat?

Làm cách nào để tạo chứng chỉ tự ký cho khách hàng?
Làm cách nào để buộc Tomcat tin tưởng chữ ký của khách hàng?

Tôi đã chơi với keytool java trong nhiều giờ ngay bây giờ.

Trả lời

59

Cuối cùng đã nhận được giải pháp cho vấn đề của tôi, vì vậy tôi sẽ đăng kết quả ở đây nếu có ai khác bị kẹt.

Nhờ Michael Martin của Michael's Software Thoughts & Ramblings tôi phát hiện ra rằng:

keytool theo mặc định sử dụng thuật toán DSA khi tạo tự ký cert.Các phiên bản trước của Firefox chấp nhận các khóa này mà không có sự cố . Với Firefox 3 beta 5, sử dụng DSA không hoạt động nhưng sử dụng RSA. Chuyển "-keyalg RSA" khi tạo chứng chỉ tự ký tạo ra một chứng nhận Firefox 3 beta 5 hoàn toàn chấp nhận.

Tôi chỉ cần đặt cờ đó, xóa tất cả bộ nhớ cache trong FireFox và nó hoạt động như một sự quyến rũ! Tôi đang sử dụng điều này như là một thiết lập thử nghiệm cho dự án của tôi và tôi cần phải chia sẻ điều này với những người khác, vì vậy tôi đã viết một tập lệnh lô nhỏ tạo hai chứng chỉ SSL. Người ta có thể bị bỏ vào thiết lập Tomcat và cái kia là tệp .p12 có thể được nhập vào FireFox/IE. Cảm ơn!

Cách sử dụng: đối số dòng lệnh đầu tiên là tên người dùng của ứng dụng khách. Tất cả mật khẩu là "mật khẩu" (không có trích dẫn). Thay đổi bất kỳ bit mã hóa cứng nào để đáp ứng nhu cầu của bạn.

@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 

Kết quả là hai tệp. Một được gọi là server.jks mà bạn thả vào Tomcat và một tệp khác có tên {username} .p12 mà bạn nhập vào trình duyệt của mình. Tệp server.jks có chứng chỉ ứng dụng khách được thêm dưới dạng chứng chỉ đáng tin cậy.

Tôi hy vọng người khác thấy điều này hữu ích.

Và đây là XML mà cần phải được bổ sung vào Tomcat conf/tập tin của bạn sever.xml (chỉ thử nghiệm trên trên 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" 
/> 

Đối với Tomcat 7:

<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

Cảm ơn rất nhiều vì điều này! Tôi đã thử nghiệm các hướng dẫn khác nhau cả ngày và đây là lần đầu tiên thực sự làm việc với clientAuth = "true " –

+0

Đây là một câu trả lời hay, tôi đã tiết kiệm rất nhiều thời gian với tập tin dơi. Và tốt nhất là nó hoạt động hoàn hảo. – Yster

2

Tạo chứng chỉ:

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

Nhập tất cả các dữ liệu cho các chứng chỉ tự ký bạn cần sau đó chỉnh sửa Tomcat của server.xml và chỉ định các thuộc tính keystore trên các kết nối SSL, ví dụ:

<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" /> 

hoặc theo tài liệu Tomcat ...

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

+3

tôi thấy rằng trước đó và nó có một nửa của tôi câu trả lời của tôi, nhưng bạn đang bỏ lỡ phần phức tạp hơn. Làm cách nào để sử dụng chứng chỉ khách hàng tự ký? Trong ví dụ bạn đã cung cấp, nó cho biết "clientAuth = 'false'." Tôi cần nó hoạt động khi được đặt thành 'true'. "Đặt giá trị này thành true nếu bạn muốn Tomcat yêu cầu tất cả khách hàng SSL xuất trình Chứng chỉ ứng dụng để sử dụng ổ cắm này." Đó là những gì tôi muốn. Tôi không thể yêu cầu máy chủ chấp nhận chứng chỉ tự ký của khách hàng – davidemm

3

Để bật xác thực ứng dụng khách, bạn cần chỉ định "cửa hàng tin cậy" cho Tomcat: cửa hàng khóa chứa chứng chỉ từ cơ quan cấp chứng chỉ gốc mà bạn tin tưởng, mỗi chứng chỉ được gắn cờ là "trustEntry".

này được xác định bởi các thuộc tính Connector phần tử: truststoreFile, truststorePass (mặc định là giá trị của keystorePass), và truststoreType (mặc định là "JKS").

Nếu khách hàng đang sử dụng chứng chỉ tự ký thì CA "gốc" của nó chính là chứng chỉ; sau đó, bạn cần phải nhập chứng chỉ tự ký của khách hàng vào cửa hàng tin cậy của Tomcat.

Nếu bạn có nhiều khách hàng, điều này sẽ nhanh chóng trở thành một rắc rối. Trong trường hợp đó, bạn có thể muốn xem xét ký giấy chứng nhận cho khách hàng của mình. Lệnh Java keytool không thể làm điều này, nhưng tất cả các tiện ích dòng lệnh cần thiết đều có sẵn trong OpenSSL. Hoặc bạn có thể nhìn vào một cái gì đó như EJBCA trên một quy mô lớn.

Tốt hơn, hãy yêu cầu khách hàng của bạn sử dụng CA miễn phí hiện có, như startcom.org. Điều này không phải lúc nào cũng hoạt động đối với chứng chỉ máy chủ, bởi vì chứng chỉ của StartCom không được bao gồm trong tất cả các trình duyệt, nhưng tình trạng này bị đảo ngược và chứng chỉ gốc StartCom có ​​thể dễ dàng được nhập vào kho lưu trữ tin cậy Tomcat.

1

Các câu trả lời trước hữu ích cho tôi, nhưng không có phiên bản công cụ trình bao. Vì vậy, tôi đã viết một.

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 

Đối tomcat8, có thể thêm cấu hình sau để 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" 
    /> 
Các vấn đề liên quan