如何从GoDaddy导入证书进行Java代码签名



我需要能够使用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!

最新更新