首页 文章

Tomcat服务器/客户端自签名SSL证书

提问于
浏览
42

我有一个运行自签名SSL证书的Apache Tomcat 6.x服务器 . 我希望客户端将自己的证书提供给服务器,以便我可以根据用户数据库对它们进行身份验证 . 基于我在网上找到的一个例子,我已经完成了所有这些工作,但是这个例子带有固定证书和预构建的JKS数据存储 . 我想用自己的证书创建自己的数据存储区但是没有运气 .

如何为Tomcat创建数据存储?
如何为Tomcat创建自签名证书?

如何为客户端创建自签名证书?
如何强制Tomcat信任客户端的签名?

我已经玩了几个小时的java keytool了 .

4 回答

  • 59

    终于得到了我的问题的解决方案,所以我会在这里发布结果,如果其他人卡住了 .

    感谢Michael's Software Thoughts & Ramblings的迈克尔·马丁,我发现:

    默认情况下,keytool在生成自签名证书时使用DSA算法 . 早期版本的Firefox毫无问题地接受了这些密钥 . 使用Firefox 3 beta 5,使用DSA不起作用,但使用RSA可以 . 生成自签名证书时传递“-keyalg RSA”会创建Firefox 3 beta 5完全接受的证书 .

    我只是设置了那个标志,清除了FireFox中的所有缓存,它就像一个魅力!我使用它作为我的项目的测试设置,我需要与其他人分享,所以我写了一个创建两个SSL证书的小批处理脚本 . 一个可以放入Tomcat设置,另一个是.p12文件,可以导入到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,另一个名为 .p12的文件将导入您的浏览器 . server.jks文件将客户端证书添加为受信任的证书 .

    我希望别人觉得这很有用 .

    这里是需要添加到Tomcat conf / sever.xml文件的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:

    <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

    要启用客户端身份验证,您需要为Tomcat指定一个“信任存储”:一个密钥存储库,其中包含您信任的根证书颁发机构的证书,每个证书都标记为“trustEntry” .

    这由 Connector 元素的属性指定: truststoreFiletruststorePass (默认值为 keystorePass )和 truststoreType (默认为"JKS") .

    如果客户端使用自签名证书,则其“根”CA是证书本身;然后,您需要将客户端的自签名证书导入Tomcat的信任存储区 .

    如果你有很多客户,这将很快成为一个麻烦 . 在这种情况下,您可能希望查看为您的客户签名证书 . Java keytool 命令无法执行此操作,但OpenSSL中提供了所有必需的命令行实用程序 . 或者你可以大规模地研究像EJBCA这样的东西 .

    更好的是,要求您的客户使用现有的免费CA,例如startcom.org . 并非所有浏览器都包含此证书,但这种情况相反,可以轻松地将StartCom根证书导入Tomcat信任库 .

  • 3

    以前的答案对我很有用,但没有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"
        />
    
  • 2

    创建证书:

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

    输入您需要的自签名证书的所有数据,然后编辑Tomcat的 server.xml 并在SSL连接器上指定密钥库属性,例如:

    <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

相关问题