java - 是否可以使用来自 CA 的 keystore (该 keystore 用于签署 JAR,也可用于签署 CSR)以创建 SSL 证书

标签 java ssl-certificate keystore keytool jks

我有一个由 CA 提供的 jks keystore ,用于签署 JAR。但是,我想通过 HTTPS 托管一些内部应用程序,因此需要创建 SSL 证书,以便可以通过 HTTPS 加密数据。但是,为了避免浏览器中出现不受信任的证书/未知主机警告,我想知道是否可以使用用于签署 JAR 的 jks keystore 来签署我的 CSR 以创建 SSL 证书。

到目前为止,我已成功执行以下操作:

  1. 使用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/

    相关文章:

    java - 计算在 java 代码中传递给 MySql 的几个查询中受影响的行数

    ssl - 将 SSL 与 docker 容器一起使用

    ssl - 将 SSL 证书转换为 .pem 格式

    ssl - 带有 Crt 文件的 Weblogic 10.3.6 SSL

    java - java中的日历日期为yyyy-MM-dd格式

    java - 类条件的等待方法不抛出 InterruptedException

    java - 算术表达式

    java - 在 Camel 2.12 中禁用 camel 证书验证

    android - 无法重新创建丢失的调试 keystore ?

    java - 使用 P7B 证书在 Spring Boot Java 应用程序中启用 HTTPS