我需要能够使用CA的证书对jar文件进行签名。
我遵循GoDaddy文档中关于如何做到这一点的说明:http://support.godaddy.com/help/article/4780/signing-java-code
然而,步骤3需要导入从GoDaddy的网站获得的证书文件。根据文档,命令为:
keytool -import -trustcacerts -keystore codesignstore -storepass <yourstorepwd> -alias codesigncert -file mycert.cer
虽然我成功地提交了CSR(由keytool生成)并得到了响应,但我一辈子都不知道如何获得mycert.cer文件。可以选择下载PEM文件。但是在运行了上面的命令之后,我得到了错误"keytool error:java.lang.Exception:Incomplete certificate chain reply"。我已经尝试过多次,并再次检查我是否使用了正确的密钥库。我甚至试过一次同时使用SSH-1和SSH-2重新设置密钥。据此人透露(https://stackoverflow.com/questions/20793254/signing-a-jar-the-signers-certificate-chain-is-not-validated?rq=1),他们至少能够成功导入PEM文件。但我不确定这是否是正确的方法。
GoDaddy的技术支持非常糟糕。与我交谈过的大多数技术人员根本不熟悉keytool,在他们将我转发给他们的SSL部门(480-505-8852)之前,我尝试了几次给他们打电话,这至少比一般支持要好一点。
如果我使用Internet Explorer或Firefox,我相信我可以自动生成CSR,而不是通过密钥工具创建CSR。然后我会通过网络浏览器导出证书。通过阅读其他各种在线文档,我相信我可以使用openssl将keytool转换为正确的格式。我还不确定这将如何运作的细节,但我看不到任何其他选择。
有没有人在这方面取得了成功,或者对如何进行有任何建议?我在这里发现了一个类似的问题(用GoDaddy的spc文件签署一个java小程序),但答案只是指向GoDaddly糟糕的文档。如果可以的话,我会使用另一个CA,但我已经支付了这笔钱,并经历了漫长的验证过程。
解决方法是联系GoDaddy,让他们重新颁发您组织的证书。在证书设置过程中,必须选择SHA-1代码签名证书,而不是SHA-2。选择SHA-1的选项只有在您的证书有效期未延长至2016年时才可用(见下文),因此请确保他们了解您的最终目标是将您的SHA-2证书重新创建为SHA-1,以便他们知道向您出售具有正确有效期的证书
我今天用我的SHA-2证书换了一个SHA-1,GoDaddy的Java代码签名指令非常有效。
GoDaddy告诉我,Keytool可能在导入从他们的SHA-2(2048长度)代码签名证书生成的证书响应链时遇到问题。我保留对Keytool的判断,因为当GoDaddy的根SHA1证书根据@mogsie的回答从pem文件中删除时,它可以很好地导入SHA-2证书。
GoDaddy在授予代码签名证书时会自动使用SHA-2,该证书将持续到2017年,因为从2016年1月1日起,微软不会接受少于SHA-2的证书,因此,如果你在市场上购买SHA-1证书,它将具有短期有效性。
这个问题可能会随着Java Keytool的更新而消失(我使用的是1.6),或者如果GoDaddy的Sha256withRSA自签名证书受到广泛信任。
正如Waterbear所提到的,答案是让GoDaddy使用SHA-1
重新颁发或重新激活您的GoDaddycert。原因是GoDaddy有两个CA服务器:Class 2 CA
用于签署SHA-1
证书,G2 CA
用于签署SHA-2
证书。虽然较旧的Class 2 CA
受到Java Truststore的信任(因此SHA-1 certificates
是受信任的),但较新的G2 CA
不是,因此除非手动安装其根证书,否则其SHA-2
证书是不受信任的(这首先会破坏购买证书的目的)。希望GoDaddy的G2 CA
很快就会受到Java Truststore的信任(在2016年之前!),但在此之前,GoDaddySHA-2
证书并不比自签名证书好。
由于我喜欢(不喜欢)创建代码签名证书的过程,所以我想我会分享我经历的过程,希望当你需要生成自己的,这将为你省去一些心痛和疼痛。
我用过godaddy,但我必须相信,无论CA是谁,都应该非常相似。
以下是我经历的步骤:
(注意,godaddy不会创建jks格式的代码签名证书还有一个额外的步骤将密钥库转换为jks)
创建密钥库:
keytool-genkey-alias codesigncert-keypass yourpassword-keyalg RSA-keysize 2048-dname"cn=server1.lccc.edu,OU=学院名称,O=学院姓名,L=Schnecksville,ST=宾夕法尼亚州,C=美国"-keystore/home/orace/codesignstore/codsignstore-storepass您的密码有效期720(存储通行证和密钥可以相同)
godaddy的生成器crt
keytool-certreq-v-别名codesigncert-file/home/orace/codesignstore/codsignstore.pem-密钥库/home/oracle/codsignstore/codsignstore
使用编辑器打开codesignstore.pem并将其粘贴到godaddy网站
当godaddy验证账户,你支付你的钱"待定"状态将消失
转到你的godaddy帐户(https://mya.godaddy.com/)
点击页面顶部的myaccount(黑色标题)
单击管理SSL证书
选择列出的代码签名证书
单击"启动"按钮
将文件下载为PEM文件
保存在本地电脑上
打开firefox,在高级部分选择查看证书,然后
证书应该列在托管视图上。
突出显示证书并选择backup(export)并将其另存为pkcs12文件
单击屏幕顶部证书旁边的"查看证书"viewer是双引号中的别名,右下角它将是用于下面的jarsigner命令
将文件复制到代码签名证书所在的服务器
使用:(例如server1/home/oracle/code_sign_cert_from_godaddy/godaddy_pkcs12.p12)*这是新的密钥库
由于密钥库必须是jks类型,而godaddy不会创建jks文件必须转换为jks格式
将pcks12转换为jks
keytool-导入密钥库-srckeystore/home/oracle/code_sign_cert_from_godaddy/godaddy_pkcs12。p12-srcstoretype pkcs12-destkeystore/home/oracle/code_sign_cert_from_godaddy/godaddy_jks.jks-deststoretype jks
jar文件处理:
unsign jacob.jar…我把jacob.jar文件复制到了一个测试中目录/test_jacob并将其重命名为jacob1.jar(注76081.1)
jar xf jacob1.jar
提取到"com"one_answers"META-INF"文件夹中,删除"META-IF"文件夹
删除旧的jacob1.jar
从/test_jacob目录重新创建jacob1.jar
jar-cvf jacob1.jar*
运行jarsigner-verify jacob1.jar,应该显示未签名。
创建一个名为mymanifest.txt 的文本文件
Permissions: all-permissions
Codebase: *
Application-Name: OracleForms
jar-ufmjacob1.jar mymanifest.txt(这会将新的清单信息放入jar文件)。。
您可以使用解压的jacob1.jar-d目录打开jacob1.jar,其中解压缩程序将驻留以验证mymanifest.txt文件现在是jar文件。
签名jar文件
刺耳的声音-密钥库/home/oracle/code_sign_cert_from_godaddy/godaddy_jks.jks-存储传递您的密码-signedjar/home/oracle/oracle/Middleware/oracle_FRHome1/forms/java/test_jacob/Signedjacob1.jar"lehigh carbon community college'sgodaddy.com,股份有限公司id"(这个别名来自上面的firefox过程)
-signedjar文件选项是必需的,如果没有它,我会出错
请注意,别名始终是jarsigner命令的最后一个条目,并且
没有-别名选项,因为在密钥工具命令上有
验证jar文件是否已签名
jarsigner-验证Signedjacob1.jar将显示:
jar已验证。
显示jar文件中的内容
jar-tvf Signedjacob1.jar
.SF文件位于.jar文件内部,.DSA文件由.RSA替换
也在.jar文件中的文件
从jar的输出-tvf Signedjacob1.jar
2721美国东部时间2014年5月5日星期一15:57:08 META-INF/LEIGH_C.SF
4231美国东部时间2014年5月5日星期一15:57:08 META-INF/LEIGH_C.RSA
我将Signedjacob1.jar文件复制到$ORACLE_HOME/forms/java目录,然后使用
登录到weblogic企业管理器
我将webutilachive参数从Jacob.jar更改为每个实例的Signedjacob1.jar
(em>>表单>>web配置>>实例名称>>全部(第一个条目应为存档参数)
将jacob.jar更改为Signedjacob1.jar时我在为生产做测试之前的测试实例,以防万一。
走走停停,你应该准备好了。。
@Waterbear非常感谢您关于获得SHA-1证书而不是SHA-2证书的解决方案。这绝对是我遇到的问题。(我本来会把这个贴在你的评论下面,但StackOverflow说太长了。)我拿到了一个3年的证书,默认情况下,GoDaddy会为某个日期后到期的证书提供SHA-2。然而,即使我重新键入并要求SHA-1,我最终还是得到了SHA-2。我不得不吊销我的证书,然后从头开始获取SHA-1证书。(从头开始,我的意思是GoDaddy必须再次验证你的公司和电话号码等等。此外,我无法获得3年证书,因为在某个日期(2016?)之后到期的任何证书都必须是SHA-2,而不是SHA-1。我基本上不得不为我的3年证书退款,而不是获得一年证书,甚至可以选择SHA-1。但在使用SHA-1之后,GoDaddy在方法#1中的指示运行良好。我建议使用keytool命令手动生成CSR(而不是通过web浏览器自动生成)。稍后,您只需下载PEM文件,并使用keytool命令将其导入到密钥库中。(这是GoDaddy在问题中发布的链接中对"方法1"的描述。)
最后,如果你必须重新颁发证书,并再次经历这个过程,我强烈建议你选择除GoDaddy之外的另一家公司进行代码签名。他们的技术支持非常可怕。他们的技术支持人员甚至向我承认,他们没有接受过这方面的培训。花在这个问题上的时间大大抵消了在证书上节省的任何钱。
keytool -import -trustcacerts -keystore codesignstore -storepass <yourstorepwd> -alias codesigncert -file mycert.cer
首先,你**必须有**mycert.cer文件。否则,您将无法导入证书。
获取"最新情况"-当前密钥库文件中有什么?我们想列出(或显示)密钥库中的内容。。
keytool -list -v -keystore codesignstore
如果它提示你输入密码,你只需按ENTER键,它就会抱怨它不可信,但为了方便起见,这没关系。
如果您想将结果"泵送"到文本文件中。。
echo.|keytool -list -v -keystore codesignstore > kstore_result.txt
注:回声。确实喜欢我之前提到的"按ENTER",所以不要太执着于此。:)
keytool -genkey -alias codesigncert -keyalg RSA -validity 1825 -keysize 2048 -keypass <yourstorepwd> -keystore codesignstore -storepass <yourstorepwd>
其他选项:
-genkey = generate a key
-keyalg RSA = use RSA's key alogorithm
-validity 1825 = how long is the key good for? Primarily used with self-signed certs as the certs from verisign or Thawte have their own expiration
-keysize 2048 = Is this a 1024 or 2048-bit enryption?
-keypass <yourstorepwd>
-keystore codesignstore
-storepass <yourstorepwd>
在这里你必须非常小心,支持部门不会告诉你这件事。。如果你试图在现有证书的同时导入其他证书,你需要小心,不要搞砸整个事情。:)
当然,如果您确实有问题,您可以删除别名并重新导入。。
keytool -delete -alias codesigncert -storepass <yourstorepwd> -keystore codesignstore
我喜欢做的一件事是"堆叠"命令,以确保我能完成列表。
例如,你有来自Godaddy的:
keytool -import -trustcacerts -keystore codesignstore -storepass <yourstorepwd> -alias codesigncert -file mycert.cer
然后,我接受每个命令,并将其设置为如下所示,以"遍历"列表:
keytool
-import
-trustcacerts
-keystore codesignstore
-storepass <yourstorepwd>
-alias codesigncert
-file mycert.cer
那么,看看这个列表,我的keytool版本支持这些吗?你有-import作为第一个。。
我刚运行了keytool-help,但我没有看到:-import,但确实看到-importcert
可能有什么问题?
Oracle向我们展示。。http://docs.oracle.com/javase/6/docs/technotes/tools/windows/keytool.html
所以,你可能需要做一些调整。。
以下是我在本地Apache Tomcat服务器(Windows)上安装的一个:
%JAVA_HOME%binkeytool -delete -alias tomcat -storepass somepass -keystore %JAVA_HOME%bin.keystore
然后。。
%JAVA_HOME%binkeytool -genkey -alias tomcat -keyalg RSA -validity 1825 -keysize 2048 -keypass somepass -keystore %JAVA_HOME%bin.keystore -storepass somepass
What is your first and last name?
[Unknown]: secure.someserver.com
What is the name of your organizational unit?
[Unknown]: COMPANY
What is the name of your organization?
[Unknown]: COMPANY
What is the name of your City or Locality?
[Unknown]: ANYTOWN
What is the name of your State or Province?
[Unknown]: MI
What is the two-letter country code for this unit?
[Unknown]: US
Is CN=secure.someserver.com, OU=COMPANY, O=COMPANY, L=ANYTOWN, ST=MI, C=US correct?
[no]: yes
注意:当您运行此操作时,您将看不到它是否成功。
让我们从这里开始,看看结果如何。。
我发现从godaddy PEM下载中获得的四个证书中,第一个是自签名根证书。
查看链(在unix上):
keytool -printcert -file response-from-godaddy.pem | grep -C1 ^Owner
响应显示了组成链的四个证书,一直到根证书。
Certificate[1]:
Owner: OU=Go Daddy Class 2 Certification Authority, O="The Go Daddy Group, Inc.", C=US
Issuer: OU=Go Daddy Class 2 Certification Authority, O="The Go Daddy Group, Inc.", C=US
--
Certificate[2]:
Owner: CN=Go Daddy Root Certificate Authority - G2, OU=https://certs.godaddy.com/repository/, O="GoDaddy.com, Inc.", L=Scottsdale, ST=Arizona, C=US
Issuer: OU=Go Daddy Class 2 Certification Authority, O="The Go Daddy Group, Inc.", C=US
--
Certificate[3]:
Owner: CN=Go Daddy Secure Certificate Authority - G2, OU=http://certs.godaddy.com/repository/, O="GoDaddy.com, Inc.", L=Scottsdale, ST=Arizona, C=US
Issuer: CN=Go Daddy Root Certificate Authority - G2, O="GoDaddy.com, Inc.", L=Scottsdale, ST=Arizona, C=US
--
Certificate[4]:
Owner: CN=REDACTED
Issuer: CN=Go Daddy Secure Certificate Authority - G2, OU=http://certs.godaddy.com/repository/, O="GoDaddy.com, Inc.", L=Scottsdale, ST=Arizona, C=US
显然,第一个证书已经在Java标准cacerts
中作为受信任的根证书。它在.pem文件中这一事实使keytool
跳闸。
我曾几次遇到同样的问题——重新密钥,我很幸运:
- 打开PEM文件
- 删除CCD_ 14到CCD_
- 在包含其余三个证书的文件上运行
keytool -import
Presto!
keytool -importcert -v -trustcacerts -keystore XXX -alias codesigning -file 234.pem
结果:
Certificate reply was installed in keystore
[Storing XXX]
以下是我所做的。。
keytool-v-genkey-dname"CN=XXX,OU=YYY,O=ZZZ,L=CCC,ST=SSS,C=US"-别名myKey-密钥库abc123-密钥库myKeystore-存储通道abc123–有效期1096-keyalg RSA-密钥大小2048-sigalg SHA1 with RSA
keytool-certreq-keyalg RSA-keysize 2048-sigalg SHA1 with RSA-v-alias myKey-file mycsr.pem-keystore myKeystore-storepass abc123
向GoDaddy提交请求(mycsr.pem),下载pem文件(在这种情况下为1b27b7d7a29a06.pem)。
下载的PEM文件包含我的签名证书以及证书链中的其他证书。我发现keytool不接受下载的PEM文件。我不得不从下载的证书中删除我的证书。我是通过密钥存储资源管理器完成的(http://keystore-explorer.sourceforge.net/)使用"检查证书"选项,打开从Godaddy收到的PEM文件(1b27b7d7a29a06.PEM)点击您的证书(不是Godaddy的其他证书),点击"PEM",点击"导出"。我将此证书命名为1b27b7d7a29a06-ycert.pem。
从GoDaddy下载根证书(gdroot-g2.crt)和中间证书(gdig2.crt(https://certs.godaddy.com/anonymous/repository.pki)
请注意,这些是/one必须使用GoDaddy G2根证书和中间证书。
接下来按以下顺序安装这些证书:
keytool-v-importcert-trustcacherts-keystore myKeystore-storepass abc123-文件gdroot-g2.crt-别名gdroot-g2
keytool-v-importcert-trustcacherts-keystore myKeystore-storepass abc123-file gdig2.crt-alias gdig2
keytool-v-importcert-keystore myKeystore-storepass abc123-alias myKey-file 1b27b7d7a29a06-mycert.pem
现在你可以签署你的应用程序:
jarsigner-密钥库myKeystore-storepass abc123-sigalg SHA1 with RSA-digitalg SHA-1 time.jar mykey
我使用Chrome/FF java插件从Web服务器部署应用程序(因此不是java小程序)时出现证书错误(CA不可信)。当我将其他Godaddy(中间)CA证书添加到我的web服务器时,问题就解决了。我和godaddy创建了一张票,他们(相当迅速)做出了的反应
尊敬的先生或女士,
感谢您联系安全证书支持。你需要将中间证书捆绑包与交叉证书一起使用G1根证书。这将解决此问题。您可以获得下面列出的证书位于https://certs.godaddy.com/repository.
中间证书捆绑包-gdig2_bundle.crt根证书-gd-class2-root.crt
导入GoDaddy捆绑包解决了问题:
export JAVA_HOME=/usr/lib/jvm/java-8-oracle/
wget https://certs.godaddy.com/repository/gd_bundle-g2.crt
$JAVA_HOME/bin/keytool -import -alias root -file ./gd_bundle-g2.crt -storepass changeit -trustcacerts -keystore $JAVA_HOME/jre/lib/security/cacerts
我不得不说,
整个Java签名bs似乎是一种独特的方法,Java不会因为更好的代码选项而消亡。
事实上,我认为它正在扼杀java。我宁愿使用任何其他编码(php/flash/etc)
的方法,然后再使用Java。Way to go Oracle!