我有一个由 CA 提供的 jks keystore ,用于签署 JAR。但是,我想通过 HTTPS 托管一些内部应用程序,因此需要创建 SSL 证书,以便可以通过 HTTPS 加密数据。但是,为了避免浏览器中出现不受信任的证书/未知主机警告,我想知道是否可以使用用于签署 JAR 的 jks keystore 来签署我的 CSR 以创建 SSL 证书。
到目前为止,我已成功执行以下操作:
使用java keytool生成证书和私钥对,创建JKS文件,即
keytool -genkeypair -dname "CN=****, OU=****, O=****, L=****, ST=****, C=**"-有效性 1000 -alias mykeystore -keypass ***** -keystore mykeystore.jks -storepass *****
上面的*被替换为实际值
使用 java keytool 创建 CSR,并将步骤 1 中的 JKS 作为输入
keytool -certreq -alias mykeystore -file mykeystore_csr.pem -keypass ***** -keystore mykeystore.jks -storepass *****
使用 keytool 将 CA JKS keystore 转换为 PKCS
keytool -importkeystore -srcstoretype jks -srckeystore cakeystore.jks -srcalias caalias -srcstorepass ***** -srckeypass ***** -deststoretype pkcs12 -destkeystore cakeystore.p12 -destalias caalias -deststorepass ***** -目标 key 密码 *****
使用 OpenSSL 将 CA PKCS 转换为 PEM
openssl pkcs12 -in cakeystore.p12 -out cakeystore.pem
使用 OpenSSL 将 CA PEM 转换为 CRT
openssl x509 -outform der -in cakeystore.pem -out cakeystore.crt
此时,我希望能够使用 cakeystore.pem 和/或 cakeystore.crt 来签署 mykeystore_csr.pem(来自上面的步骤 2),然后可以将其转换回 JKS 以用作CA 签名的 SSL 证书
这可能吗?任何想法或建议将不胜感激。
谢谢
最佳答案
吹毛求疵:颁发证书并不是签署 CSR。如果您查看 CSR 的内容和证书的内容,您会发现它们是不同的 - 尽管证书中最重要的字段(公钥)确实来自 CSR,并且主题名称可能 这样做。
要有效签署/颁发证书,您必须拥有一个“中级 CA”证书,其中 BasicConstraints
指定 CA:true
和 KeyUsage
(如果使用,通常是)至少指定 keyCertSign
和匹配的私钥。请参阅What prevents a fake ssl certificate chain以及 security.SX 链接。
OpenSSL 在发布时实际上并不强制执行这些限制(尽管它主要在验证时强制执行);使用 PEM 格式的证书和私钥文件,您可以使用带有 -req -CA/-CAkey
选项的 x509
子命令的非常基本的功能来颁发证书,或者稍微更完整的 ca
子命令,记录在您系统上各自的手册页 or on the web (迄今为止在命令下编号的版本,在 man1 下开发“master”)。
x509 -req -CA* ...
只需读取 CSR,格式化具有可选有效长度和可选配置扩展的证书(请参阅 man)并使用 CA key 对其进行签名,设置CA 证书作为父证书(始终为颁发者和可选的 AKID)。 ca
通过更灵活的扩展选项执行相同的操作,此外还维护已颁发证书的简单“数据库”(两个文件和一个目录),可用于其他与 CA 相关的功能,例如颁发 CRL和/或 OCSP 响应(同上)。
但是,如果您(或者更确切地说您的任何系统)使用此类证书,则任何符合标准的对等方都会拒绝该证书,因为该证书颁发无效。根据对等点的不同,您有时可以禁用或覆盖证书检查,以便接受无效的证书,但如果您不想要安全性,您不妨首先关闭 SSL/TLS,这样可以节省时间和精力。
如果涉及的 CA 是您组织的内部机构,他们可能愿意信任您的证书签名(子 CA)证书,只要您采取预防措施,防止滥用您的子 CA,从而可能危及任何人的利益。该组织的其他业务。 OTOH,如果这是像 Verisign 或 GoDaddy 这样的公共(public) CA,向您颁发子 CA 证书意味着他们将把整个业务交给您,因为任何滥用您的子 CA 都可能导致他们破产;对于需要从互联网上的陌生人那里获得基本知识建议的人来说,这是不可能的。
关于java - 是否可以使用来自 CA 的 keystore (该 keystore 用于签署 JAR,也可用于签署 CSR)以创建 SSL 证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41170399/