我的任务是将 Java 7 Update 55 以及 Java 部署规则集部署到所有 Active Directory Windows 客户端。我已经设法获得了可靠的 Java 软件部署设置,但现在我正在努力部署部署规则集,以便正确配置 Java。我在签署 DeploymentRuleSet.jar 文件时遇到了麻烦。我有一个 Active Directory 证书服务服务器,负责向所有客户端分发证书,我想使用此 CA 颁发的证书。
每次我执行此链接我将已签名的 DeploymentRuleSet.jar 文件复制到客户端并尝试运行允许的 Java 小程序,但始终收到错误:“无法验证自签名的部署规则集 jar”。
以下是我执行操作的确切顺序思考应该这样做但没有:
- 我根据提供的模板创建了 ruleset.xml 文件这里。
- 我下载并安装了 JDK v1.7.0.60。
- 我将 ruleset.xml 文件复制到 JDK 的 bin 文件夹中。
- 我通过发出以下命令创建了 DeploymentRuleSet.jar 文件:
jar -cvf DeploymentRuleSet.jar ruleset.xml
- 我生成了一个新的密钥库和密钥:
.\keytool.exe -genkey -alias mykey -keyalg RSA -keysize 2048 -keystore keystore.jks -storepass changeit
- 我生成了一个 CSR:
keytool -certreq -alias mykey -file csr.csr -keystore keystore.jks -storepass changeit
- 我从密钥库中提取了私钥:
keytool -v -importkeystore -srckeystore keystore.jks -srcalias mykey -destkeystore myp12file.p12 -deststoretype PKCS12
- 我将私钥重命名为Windows友好的扩展:
rename myp12file.p12 myp12file.pfx
- 我确认我的CA有一个有效的CodeSigning模板。
- 我使用以下模板签署了 CSR:
C:\Windows\system32\certreq.exe -submit -attrib "CertificateTemplate:GeneralCodeSigning" csr.csr mykey.cer myp12file.pfx
- 我通过 RDP 连接到 CA,并使用“根证书颁发机构”证书模板导出了计算机个人存储中的证书。我相信这是“根 CA”证书。我将其保存在 JDK 的 bin 文件夹中,文件名为 ca-cert.cer。
- 我将签名的密钥和根 CA 证书导入密钥库:
.\keytool.exe -importcert -keystore keystore.jks -file ca-cert.cer -alias CARoot -storepass changeit
- 我签署了 JAR 文件:
.\jarsigner.exe -keystore keystore.jks -storepass changeit DeploymentRuleSet.jar myKey
- 我使用 Powershell 将签名密钥附加到根 CA 证书:
Get-Content .\mykey.cer | % { Add-Content -Value $_ -Path .\ca-cert.cer}
- 我将组合的证书导入到密钥库中:
keytool -importcert -keystore C:\Users\user\AppData\LocalLow\Sun\Java\Deployment\security\cacerts -storepass changeit -alias mykey -file ca-cert.cer -noprompt
- 我将根 CA 导入密钥库:
.\keytool.exe -importcert -keystore C:\users\user\AppData\LocalLow\Sun\Java\Deployment\security\cacerts -storepass changeit -alias myKey -file .\ca-cert.cer -noprompt
- 我将 DeploymentRuleSet.jar 文件复制到客户端的 C:\Windows\Sun\Java\Deployment 文件夹中。
- 我向客户端的 CA 请求了用户代码签名证书并安装了它。
- 我打开 Java 控制面板并转到“安全”选项卡。我确认我有“查看活动部署规则集”链接。
- 我单击了 Java 控制面板中的“管理证书”和“系统”选项卡。然后我将证书类型更改为签名者 CA,但我找不到我在此处创建的任何证书。它应该在这里的某个地方吗?
当我访问一个应该被允许的 URL 时,出现了自签名证书问题。正如你所看到的,我已经遇到过很多次了。如果能得到任何帮助,我将不胜感激。
答案1
您需要做几件事。
- 首先,Java JVM 的信任库中有 PKI 中的根 CA 证书
- 签名代码的执行位置和进行代码签名的位置,默认情况下为%JAVAHOME%/lib/security/cacerts
- 在 Windows 上,这通常是%PROGRAMFILES%\ Java \ jre7 \ lib \ security \ cacerts
- 此外,对于执行该代码的任何框,它都应位于系统信任库中
- 视窗:mmc.exe --> 证书 --> 计算机帐户 --> 受信任的根证书颁发机构
- 红帽企业版:/etc/pki/tls/certs/
- 签名代码的执行位置和进行代码签名的位置,默认情况下为%JAVAHOME%/lib/security/cacerts
- 其次,确保您的代码签名证书已设置为对代码进行签名
- 它应该具有扩展密钥使用“代码签名”(这可以用数字表示为 OID 1.3.6.1.5.5.7.3.3 存在并设置为 true)
- 它应该具有密钥用途,包括数字签名
- 它应该将基本约束“CA”设置为 false(这也可能列为“主题类型 = 最终实体”),并将“关键”设置为“true”
- 它应该有一个 CDP(CRL 分发点)列出,并且应该指向 CRL 可用的有效 HTTP 或 LDAP URL(这可以让您明确地不信任在签名后发现不合适的代码)