6

我想生成一个自签名的可信证书和一个 csr,并使用创建的可信证书对 csr 进行签名。我正在用 keytool 尝试它。在使用以下命令创建可信证书的第一步

keytool -genkey -alias mytrustCA -keyalg RSA -keystore keystore.jks -keysize 1024

它将证书放入密钥库的位置。如何将其存储到文件中?当我使用

keytool -list -v -keystore 证书/test.keystore

使用上述“genkey”命令创建的证书,其条目类型为“PrivateKeyEntry”,如何创建受信任的证书条目?

4

2 回答 2

10

在您的第一个命令中,您使用了-genkey生成名为keystore.jks.

要将证书导出为.CER格式文件,您需要使用-exportkeytool 的选项。

一个例子是:

keytool -v -export -file mytrustCA.cer -keystore keystore.jks -alias mytrustCA

这将生成一个名为mytrustCA.cer

要生成证书请求以发送给 CA 以获取签名证书,您需要使用-certreqkeytool 选项。

一个例子是:

keytool -v -certreq -keystore keystore.jks -alias mytrustCA

这将要求输入密钥库密码,并且在成功验证后,它将显示证书请求,如下所示(示例)。

-----BEGIN NEW CERTIFICATE REQUEST-----
MIIBtDCCAR0CAQAwdDELMAkGA1UEBhMCSU4xFDASBgNVBAgTC01haGFyYXNodHJhMQ8wDQYDVQQH
EwZNdW1iYWkxEjAQBgNVBAoTCU1pbmRzdG9ybTEUMBIGA1UECxMLRW5naW5lZXJpbmcxFDASBgNV
BAMTC1JvbWluIElyYW5pMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqOLEumwLHlzIUAPD6
Ab1pVp84mhSNCCcUKInZbSdiDYnKSr46EjEw0PtZOVPJbM4ZG3bZsOboYr0YfViJi41o4yJICFAZ
8wCQQxPK/4N8MPV7C5WDH28kRKGH/Pc2e7CxV+as573I34QmkINk7fEyERMDwP/WgmrcKZgL0sfy
ewIDAQABoAAwDQYJKoZIhvcNAQEFBQADgYEAlcpjOUZFP9ixskXSA7HNlioWwjbL9f9rQskJ9rK8
kGLJ1td+mqqm20yo/JrKCzZjOMqr/aL6Zw2dkoyU34T9HnR2Bs3SgKn6wlYsYEVvVBk71Ec6PeTi
e+fhfNQEHsj4wuB4qixO3s1jtsLDy+DpTzYguszczwxXGFVNuk+y2VY=
-----END NEW CERTIFICATE REQUEST-----

您需要发送此证书请求或将其粘贴到数字证书签名者网页中。或者,您甚至可以将此输出重定向到文件而不是控制台,如下所示:

keytool -v -certreq -keystore keystore.jks -alias mytrustCA > mycertreq.txt
于 2012-07-03T16:18:34.083 回答
1

这是一个没有任何交互式提示的命令行示例,可能更容易使用这种方式并将所有命令记录在文本文件中。

创建 JavaKeyStore 文件和自签名证书密钥

keytool -genkey -alias server -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -storetype JKS \
  -keystore     my.server.com.jks -storepass mypwd -keypass mypwd \
  -dname    "CN=my.server.com, OU=EastCoast, O=MyComp Ltd, L=New York, ST=, C=US" \
  -ext "SAN=dns:my.server.com,dns:www.my.server.com,ip:11.22.33.44" \
  -validity 7200
keytool -keystore my.server.com.jks -storepass mypwd -list -v 

您可以在 Tomcat 中使用此密钥库 (.jks) 文件,但浏览器会发出自签名证书警告。SubjectAlternativeName使用一个或多个 dns 名称和可选的 ip 地址给出扩展参数。

创建 CertificateSigningRequest 文件

keytool -certreq -alias server -file my.server.com.csr \
  -keystore my.server.com.jks -storepass mypwd \
  -ext "SAN=dns:my.server.com,dns:www.my.server.com,ip:11.22.33.44" \
keytool -printcertreq -file my.server.com.csr

将 .csr 文件发送给 CertificateAuthority(CA) 运营商进行签名,您稍后应该会收到一个证书(cer) 文件。您必须SubjectAlternativeName第二次在此处给出扩展参数。

将证书文件导入密钥库

keytool -import -trustcacerts -keystore my.server.com.jks -storepass mypwd \
  -alias server -file my.server.com.cer

此命令将您的私钥和公共证书与受信任的有效 CA 机构配对。浏览器不应再发出证书警告。

导入中间 CA 证书

keytool.exe -importcert -trustcacerts -file SomeCA.cer -alias someca -keystore my.server.com.jks -storepass mypwd
keytool.exe -importcert -trustcacerts -file SomeCAIssuing.cer -alias somecaissuing -keystore my.server.com.jks -storepass mypwd

这会导入 CA 颁发的证书,您可能需要在导入证书文件 (.cer) 之前执行此操作。

您的主机名证书可能有一个到期日期,因此一旦即将到期,从密钥库创建一个新的签名请求(.csr)文件,将新的 csr 文件发送给 CA 机构,导入新的证书(.cer)文件。


您很可能在 Tomcat Web 服务器中使用 jks 密钥库,因此这里是tomcat/conf/server.xmlhttps 连接器示例。

雄猫 9+

<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" 
connectionTimeout="20000" maxThreads="150" 
URIEncoding="UTF-8" useBodyEncodingForURI="true" maxHttpHeaderSize="65536"
compression="on" compressionMinSize="2048" noCompressionUserAgents="gozilla, traviata" 
compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,text/json,application/json"
SSLEnabled="true" scheme="https" secure="true">
<SSLHostConfig protocols="all">
  <Certificate certificateKeystoreFile="my.server.com.jks" certificateKeystoreType="JKS"
   certificateKeystorePassword="mypwd" certificateKeyAlias="server" />
</SSLHostConfig>
</Connector>

Tomcat8.5,如果早于 8.0,您可能需要删除密码参数

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" 
            disableUploadTimeout="true" useBodyEncodingForURI="true"
            acceptCount="300" acceptorThreadCount="2" maxThreads="400"
            compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,text/json,application/json"
            compression="off" compressionMinSize="2048"

            keystoreFile="my.server.com.jks" keystorePass="mypwd" keyAlias="server"
            SSLEnabled="true" scheme="https" secure="true" clientAuth="false"
            sslEnabledProtocols="+TLSv1,+TLSv1.1,+TLSv1.2"
            ciphers="
    TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
    TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384,
    TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384,
    TLS_DHE_DSS_WITH_AES_256_CBC_SHA256,
    TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
    TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA,
    TLS_ECDH_RSA_WITH_AES_256_CBC_SHA,
    TLS_DHE_DSS_WITH_AES_256_CBC_SHA,
    TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
    TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256,
    TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256,
    TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,
    TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
    TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA,
    TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,
    TLS_DHE_DSS_WITH_AES_128_CBC_SHA,
    TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
    TLS_ECDH_ECDSA_WITH_RC4_128_SHA,
    TLS_ECDH_RSA_WITH_RC4_128_SHA,
    TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
    TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
    TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
    TLS_RSA_WITH_AES_256_GCM_SHA384,
    TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384,
    TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384,
    TLS_DHE_DSS_WITH_AES_256_GCM_SHA384,
    TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
    TLS_RSA_WITH_AES_128_GCM_SHA256,
    TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256,
    TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256,
    TLS_DHE_DSS_WITH_AES_128_GCM_SHA256,
    TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA,
    TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,
    TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA,
    TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA,
    SSL_RSA_WITH_RC4_128_MD5,
    SSL_RSA_WITH_RC4_128_SHA,
    TLS_EMPTY_RENEGOTIATION_INFO_SCSVF
            "
        />
于 2020-05-08T07:35:46.057 回答