我有一个CA提供的jks密钥库,用于签署JAR。但是,我想通过HTTPS托管一些内部应用程序,因此需要创建一个SSL证书,以便可以通过HTTPS加密数据。但是,为了避免在浏览器中出现不受信任的证书/未知主机警告,我想知道是否可以使用用于签署JAR的jks密钥库来签署我的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密钥库转换为PKCS
keytool -importkeystore -srcstoretype jks -srckeystore cakeystore.jks -ssccalias caalias -srcstorepass ***** -srckeypass ***** -deststoretype pkcs12 -destkeystore cakeystore.p12 -destalias caalias -deststorepass ***** - destkeypass *****
使用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证书
这可能吗?任何想法或建议都将非常感激。
由于
答案 0 :(得分:2)
Nitpick:颁发证书并不签署CSR。如果您查看CSR的内容和证书的内容,它们是不同的 - 尽管证书中最重要的一个字段,即publickey,来自CSR,主题名称可能这样做。
要有效地签署/颁发证书,您必须拥有BasicConstraints
指定CA:true
和KeyUsage
的“中间CA”证书(如果使用,则为通常是)至少指定keyCertSign
,并匹配私钥。请参阅What prevents a fake ssl certificate chain和那里的security.SX链接。
OpenSSL实际上并没有在发布时强制执行这些限制(尽管它主要在验证时执行);使用PEM格式的cert和privatekey文件,您可以使用带有x509
选项的-req -CA/-CAkey
子命令的基本功能或稍微更完整的ca
子命令来颁发证书,记录在系统or on the web上各自的手册页上(命令下的编号版本,man1下的开发'master')。
x509 -req -CA* ...
只读取CSR,格式化具有可选有效长度的证书和可选配置的扩展(请参阅man)并使用CA密钥对其进行签名,将CA证书设置为父证书(始终为Issuer)一个孩子)。 ca
使用更灵活的扩展选项来执行相同操作,此外还维护一个简单的“数据库”(两个文件和一个目录)的已颁发证书,这些证书可用于其他与CA相关的功能,如发布CRL和/或OCSP回应(同上)。
但是,如果您(或者您的任何系统)使用此类证书,则任何符合标准的对等方都将拒绝该证书作为无效发布。根据对等方的不同,您有时可以禁用或覆盖证书检查,以便接受无效证书,但如果您不想要安全性,那么您最好先关闭SSL / TLS并节省时间和精力。 / p>
如果涉及的CA是您组织的内部人员,他们可能愿意信任您使用证书签名(sub-CA)证书,只要您采取预防措施以防止任何可能危及您的子CA的滥用该组织的其他业务。 OTOH如果这是一个像Verisign或GoDaddy这样的公共CA,向您发放子CA证书意味着他们将整个业务交给您,因为任何滥用您的子CA都会使他们破产;对于需要从互联网上的陌生人那里获得基本建议的人来说,这是不会发生的。