我需要能够使用来自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 in 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,而不是创建一个通过密钥工具。然后我将通过Web浏览器导出证书。从阅读各种其他在线文档,我相信我可以使用openssl转换为keytool的正确格式。我不确定这将如何工作的细节,但我没有看到任何其他选择。
有没有人对此有所成功或有任何关于如何进行的指示?我在这里找到了一个类似的问题(Signing a java applet with an spc file from GoDaddy),但答案只是简单地指出了GoDaddy糟糕的文档。如果可以的话,我会使用另一个CA,但我已经付了钱,经历了冗长的验证过程。
答案 0 :(得分:10)
解决方法是联系GoDaddy并让他们重新颁发您组织的证书。在证书设置过程中,您必须选择SHA-1协同代码证书而不是SHA-2。选择SHA-1的选项仅在证书有效期未延伸至2016(见下文)时可用,因此确保他们理解您的最终目标是将SHA-2证书重新创建为SHA-1,因此他们知道向您出售具有正确有效期的证书。
我今天将SHA-2证书换成SHA-1,GoDaddy's Java Code Signing instructions完美无缺。
GoDaddy告诉我,Keytool可能无法导入从其SHA-2(2048长度)代码签名证书生成的证书响应链。我保留对Keytool的判断,因为当根据@mogsie的答案从gom文件中删除GoDaddy的根SHA1证书时,它会很好地导入SHA-2证书。
GoDaddy在授予将延长到2017年的代码签名证书时自动使用SHA-2,因为微软不会接受低于SHA-2的January 1, 2016,所以如果你在市场上购买SHA-1证书,它将具有短期效力。
Java Keytool更新可能会消失(我使用的是1.6),或者GoDaddy的Sha256withRSA自签名证书会受到广泛信任。
答案 1 :(得分:5)
Waterbear提到的答案是让GoDaddy使用SHA-1
重新发布或重新设置你的GoDaddy证书。 原因是GoDaddy有两个CA服务器:Class 2 CA
用于签署SHA-1
证书,G2 CA
用于签署SHA-2
证书。虽然Java Truststore信任较旧的Class 2 CA
(因此SHA-1 certificates
是受信任的),但较新的G2 CA
不,因此,除非您手动安装其根证书(这首先违背了购买证书的目的),否则其SHA-2
证书不受信任。希望GoDaddy的G2 CA
很快就会被Java Truststore信任(2016年之前!),但在此之前,GoDaddy SHA-2
证书并不比自签名证书更好。
答案 2 :(得分:5)
因为我喜欢(不)创建代码验证证书的过程 很多,我想我会分享我经历的过程,并希望何时 你需要生成自己的,这将为你节省一些心痛 和痛苦。
我使用了godaddy,但我必须相信CA应该是谁 非常相似。
这些是我通过的步骤:
(请注意,godaddy不会以jks格式创建代码签名证书 并且还有一个额外的步骤来将密钥库转换为jks)
keytool -genkey -alias codesigncert -keypass yourpassword -keyalg RSA - keysize 2048 -dname&#34; cn = server1.lccc.edu,OU = College Name,O = College 姓名,L = Schnecksville,ST =宾夕法尼亚州,C = US&#34; - keystore / home / oracle / codesignstore / codesignstore -storepass yourpassword -validity 720(storepass和keypass可以是相同的)
keytool -certreq -v -alias codesigncert - 文件/home/oracle/codesignstore/codesignstore.pem - keystore / home / oracle / codesignstore / codesignstore
当godaddy验证帐户并且您付款时,等待&#39; 状态将消失
转到你的godaddy帐户(https://mya.godaddy.com/)
点击页面顶部的myaccount(黑色标题中)
点击管理SSL证书
选择列出的代码签名证书
点击“启动”按钮
将文件下载为PEM文件
将其保存在您的本地电脑上
证书应列在托管视图上。
突出显示证书并选择备份(导出)并将其另存为pkcs12 文件
点击证书旁边屏幕顶部的查看证书 viewer是双引号中的别名,右下角将是别名 用于下面的jarsigner命令
使用:(例如server1 / home / oracle / code_sign_cert_from_godaddy / godaddy_pkcs12.p12)*这是新的密钥库
因为密钥库必须是jks类型,而且godaddy不会创建一个 jks文件必须转换为jks格式
keytool -importkeystore - 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
取消签名jacob.jar ...我将jacob.jar文件复制到了测试中 directory / test_jacob并将其重命名为jacob1.jar(注释760815.1)
jar xf jacob1.jar
摘录到&#34; com&#34;和&#34; META-INF&#34;文件夹,删除&#34; META-INF&#34; 夹
删除旧的jacob1.jar
从/ test_jacob目录重新创建jacob1.jar
jar -cvf jacob1.jar *
运行jarsigner -verify jacob1.jar,应显示unisigned。
创建一个文本文件,调用mymanifest.txt
Permissions: all-permissions
Codebase: *
Application-Name: OracleForms
jar -ufm jacob1.jar mymanifest.txt(这会将新的清单信息放入 jar文件)..
你可以用unzip jacob1.jar -d目录打开jacob1.jar unzip将驻留以验证mymanifest.txt文件现在是其中的一部分 jar文件。
jarsigner - keystore /home/oracle/code_sign_cert_from_godaddy/godaddy_jks.jks - storepass yourpassword - signedjar / home / oracle / Oracle / Middleware / Oracle_FRHome1 / forms / java / tes t_jacob / Signedjacob1.jar jacob1.jar&#34; lehigh carbon community college&#39; s godaddy.com,inc。 ID&#34; (这个别名来自上面的firefox进程)
没有-alias选项,因为keytool命令
jarsigner -verify Signedjacob1.jar将显示:
jar验证。
jar -tvf Signedjacob1.jar
文件也在.jar文件中
来自jar -tvf Signedjacob1.jar 输出的2721 Mon May 05 15:57:08 EDT 2014 META-INF / LEHIGH_C.SF
4231 Mon May 05 15:57:08 EDT 2014 META-INF / LEHIGH_C.RSA
我将Signedjacob1.jar文件复制到$ ORACLE_HOME / forms / java 目录然后使用
登录weblogic企业管理器
我将webutilarchive参数从Jacob.jar更改为 每个实例的Signedjacob1.jar
(em&gt;&gt;表单&gt;&gt;网络配置&gt;&gt;实例名称&gt;&gt;全部(第一个) entry应该是归档参数)
将jacob.jar更改为Signedjacob1.jar时,我为每个人执行了此操作 在我为生产做之前我的测试实例,以防万一。
停止并启动wls_forms,你应该好好去......
答案 3 :(得分:2)
@Waterbear非常感谢您获得SHA-1证书而不是SHA-2的解决方案。这绝对是我遇到的问题。 (我会在你的评论下面发布这个,但是StackOverflow说它太长了。)我已经获得了3年的证书,默认情况下,GoDaddy会在特定日期之后为证书提供SHA-2。但是,即使我重新键入并要求使用SHA-1,我仍然使用SHA-2。我必须撤销我的证书,然后从头开始获取SHA-1证书。 (从头开始,我的意思是GoDaddy必须再次验证您的公司和电话号码以及所有这些。)顺便说一句,如果您撤销证书,请务必先向GoDaddy申请许可,因为技术上他们没有给你退款。另外,我无法获得3年证书,因为在特定日期(2016年?)之后到期的任何内容必须是SHA-2而不是SHA-1。我基本上不得不获得3年期证书的退款,而是获得1年的证书甚至可以获得SHA-1选项。但是在使用SHA-1之后,GoDaddy在方法#1中的指示运行良好。我建议使用keytool命令手动生成CSR(而不是通过Web浏览器自动生成)。稍后,您只需下载PEM文件并使用keytool命令将其导入密钥库。 (这就是GoDaddy在问题中发布的链接中的“方法1”中所描述的内容。)
最后,如果您必须重新签发证书,并再次完成此过程,我强烈建议您选择除GoDaddy之外的其他公司进行代码签名。他们的技术支持绝对是可怕的。他们的支持技术人员甚至向我承认他们没有接受过这方面的培训。在这个问题上花费的时间大大抵消了证书上节省的任何资金。
答案 4 :(得分:1)
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版本是否支持这些? 你有 - 作为第一个进口..
我刚刚运行了keytool -help,我没有看到:-import,但确实看到-importcert
那里可能存在问题?
甲骨文告诉我们.. http://docs.oracle.com/javase/6/docs/technotes/tools/windows/keytool.html所以,你可能需要做一些调整..
这是我在本地Apache Tomcat服务器(Windows)上设置的一个:
%JAVA_HOME%\bin\keytool -delete -alias tomcat -storepass somepass -keystore %JAVA_HOME%\bin\.keystore
然后..
%JAVA_HOME%\bin\keytool -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
注意:运行时,您将看不到它是否成功。
让我们从这里开始看看结果是什么......
答案 5 :(得分:1)
我发现你从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
。{/ p>
我为同样的问题挣扎了好几次,我很幸运:
----BEGIN
的第一个块删除为----END
,keytool -import
。的Presto!
keytool -importcert -v -trustcacerts -keystore XXX -alias codesigning -file 234.pem
结果:
Certificate reply was installed in keystore
[Storing XXX]
答案 6 :(得分:0)
这就是我做的......
keytool -v -genkey -dname“CN = XXX,OU = YYY,O = ZZZ,L = CCC,ST = SSS,C = US”-alias myKey -keypass abc123 -keystore myKeystore -storepass abc123 -validity 1096 -keyalg RSA -keysize 2048 -sigalg SHA1withRSA
keytool -certreq -keyalg RSA -keysize 2048 -sigalg SHA1withRSA -v -alias myKey -file mycsr.pem -keystore myKeystore -storepass abc123
向GoDaddy提交请求(mycsr.pem),下载PEM文件(本例中为1b27b7d7a29a06.pem)。
下载的PEM文件包含我签名的证书以及证书链中的其他证书。我发现keytool不会接受下载的PEM文件。我不得不从下载的证书中删除我的证书。我通过Key Store Explorer(http://keystore-explorer.sourceforge.net/)执行此操作。使用“检查证书”选项,打开从Godaddy收到的PEM文件(1b27b7d7a29a06.pem),点击您的证书(不是GoDaddy的其他人之一),点击“PEM”,点击“导出”。我将此证书命名为1b27b7d7a29a06-mycert.pem。
从GoDaddy(https://certs.godaddy.com/anonymous/repository.pki)下载根(gdroot-g2.crt)和中间(gdig2.crt)证书
请注意,这些/必须使用GoDaddy G2根证书和中间证书。
接下来按此顺序安装这些证书:
keytool -v -importcert -trustcacerts -keystore myKeystore -storepass abc123 -file gdroot-g2.crt -alias gdroot-g2
keytool -v -importcert -trustcacerts -keystore myKeystore -storepass abc123 -file gdig2.crt -alias gdig2
keytool -v -importcert -keystore myKeystore -storepass abc123 -alias myKey -file 1b27b7d7a29a06-mycert.pem
现在您可以在应用中签名:
jarsigner -keystore myKeystore -storepass abc123 -sigalg SHA1withRSA -digestalg SHA-1 time.jar mykey
答案 7 :(得分:0)
我使用Chrome / FF java插件从我的网络服务器部署应用程序(因此不是Java applet)时出现了证书错误(CA不信任)。在我的Web服务器中添加其他Godaddy(中间)CA证书时,问题解决了。我和godaddy一起制作了一张票,他们回复(非常迅速)
亲爱的先生或女士,感谢您联系安全证书支持。你需要 使用带有交叉证书的中间证书包和 G1根证书。这将解决此问题。你可以获得 以下列出的证书为https://certs.godaddy.com/repository。
中级证书包 - gdig2_bundle.crt根证书 - GD-类2-root.crt中
答案 8 :(得分:0)
导入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
答案 9 :(得分:-1)
我不得不说,
这整个Java签名bs似乎是Java的一种独特方法,不会因为更好的代码选项而死亡。
实际上我认为这是在杀死java。我宁愿使用任何其他编码(php/flash/etc)
的方法,然后再次使用Java。 Way to go Oracle!