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

我需要能够使用来自CA的证书来签署jar文件。

我按照GoDaddy的文档说明如何执行此操作: http : //support.godaddy.com/help/article/4780/signing-java-code

但是,步骤3需要导入从GoDaddy网站获取的证书文件。 根据文档,命令是:

keytool -import -trustcacerts -keystore codesignstore -storepass  -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的正确格式。 我不确定这将如何工作的细节,但我没有看到任何其他选择。

有没有人成功的这个或有任何指示如何进行? 我在这里找到了一个类似的问题( 使用GoDaddy的spc文件签署一个java小程序 ),但答案只是指向GoDaddy糟糕的文档。 如果可以的话,我会使用另一个CA,但我已经付了钱,经历了漫长而漫长的validation过程。

解决方法是联系GoDaddy并让他们重新颁发您组织的证书。 在证书设置过程中,您必须选择SHA-1协同代码证书而不是SHA-2。 选择SHA-1的选项仅在证书有效期未延伸至2016(见下文)时才可用,因此请确保他们了解您的最终目标是将SHA-2证书重新创建为SHA-1,因此他们知道向您出售具有正确有效期的证书。

我今天将SHA-2证书交换为SHA-1, GoDaddy的Java代码签名说明完美无缺。

GoDaddy告诉我,Keytool可能无法导入从其SHA-2(2048长度)协同代码证书生成的证书响应链。 我保留对Keytool的判断,因为当根据@mogsie的答案从gom文件中删除GoDaddy的根SHA1证书时,它会导入SHA-2证书。

GoDaddy在授予将延长到2017年的代码签名证书时会自动使用SHA-2,因为从2016年1月1日开始微软不会接受少于SHA-2,因此如果您在市场上获得SHA-1证书,它将会具有短期效力。

Java Keytool更新(我使用1.6)或GoDaddy的Sha256withRSA自签名证书变得广泛受信任,这个问题可能会消失。

正如Waterbear所提到的,答案是让GoDaddy使用SHA-1重新发布或重新设置你的GoDaddy证书。 原因是GoDaddy有两个CA服务器:用于签署SHA-1证书的Class 2 CA和用于签署SHA-2证书的G2 CA 虽然较早的Class 2 CA受Java Truststore信任(因此SHA-1 certificates是受信任的),但较新的G2 CA不受信任,因此除非您手动安装其根证书(这会使其失败,因此不会信任其SHA-2证书)首先购买证书的目的)。 希望GoDaddy的G2 CA很快就会受到Java Truststore的信任(2016年之前!),但在此之前,GoDaddy SHA-2证书并不比自签名证书更好。

由于我非常喜欢(不)创建代码validation证书的过程,我想我会分享我通过的过程,并希望当你需要生成自己的过程时,这将为你节省一些心痛和痛苦。

我使用的是godaddy,但我必须相信CA的步骤应该非常相似。

这些是我通过的步骤:

(请注意,godaddy不会以jks格式创建代码签名证书,并且还需要额外的步骤将密钥库转换为jks)

创建密钥库:

keytool -genkey -alias codesigncert -keypass yourpassword -keyalg RSA – keysize 2048 -dname“cn = server1.lccc.edu,OU = College Name,O = College Name,L = Schnecksville,ST = Pennsylvania,C = US” – keystore / home / oracle / codesignstore / codesignstore -storepass yourpassword -validity 720(storepass和keypass可以是相同的)

Generater crt for godaddy

keytool -certreq -v -alias codesigncert – file /home/oracle/codesignstore/codesignstore.pem – keystore / home / oracle / codesignstore / codesignstore

使用编辑器打开codesignstore.pem并将其粘贴到godaddy站点

当godaddyvalidation帐户并且您付款时,“待处理”状态将消失

去你的godaddy帐户( https://mya.godaddy.com/

点击页面顶部的myaccount(在黑色标题中)

单击“管理SSL证书”

选择列出的代码签名证书

单击“启动”按钮

将文件下载为PEM文件

将它保存在您的本地电脑上

打开firefox,在高级部分选择查看证书,然后

证书应列在托管视图上。

突出显示证书并选择备份(导出)并将其另存为pkcs12文件

单击证书查看器旁边的屏幕顶部的视图证书是双引号中的别名,右下角它将是下面的jarsigner命令中使用的别名

将文件复制到代码签名证书所在的服务器

used :(例如server1 / home / oracle / code_sign_cert_from_godaddy / godaddy_pkcs12.p12)*这是新的密钥库

因为密钥库必须是jks类型,而且godaddy不会创建jks文件,所以必须将其转换为jks格式

将pcks12转换为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

jar文件处理:

unsign jacob.jar …我将jacob.jar文件复制到测试目录/ test_jacob并将其重命名为jacob1.jar(注760815.1)

jar xf jacob1.jar

提取到“com”和“META-INF”文件夹,删除“META-INF”文件夹

删除旧的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将驻留在该目录中以validationmymanifest.txt文件现在是jar文件的一部分。

标志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“lehigh carbon community college’s godaddy.com ,inc.id“(这个别名来自上面的firefox进程)

-signedjar文件选项是必需的,没有它我得到错误

请注意,别名始终是jarsigner命令的最后一个条目

keytool命令没有-alias选项

validationjar文件已签名

jarsigner -verify Signedjacob1.jar将显示:

jarvalidation。

在jar文件中显示什么

jar -tvf Signedjacob1.jar

.SF文件位于.jar文件中,.DSA文件由.RSA替换

文件也在.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 >> forms >> web配置>>实例名>> all(第一个条目应该是archive参数)

将jacob.jar更改为Signedjacob1.jar时,我为每个测试实例执行了此操作,然后再进行生产,以防万一。

停下来开始wls_forms,你应该好好去……

@Waterbear非常感谢您获得SHA-1证书而不是SHA-2的解决方案。 这绝对是我遇到的问题。 (我会在你的评论下面发布这个,但是StackOverflow表示它太长了。)我已经获得了3年的证书,默认情况下,GoDaddy会在特定日期之后颁发SHA-2证书。 但是,即使我重新键入并要求使用SHA-1,我仍然使用SHA-2。 我不得不撤销我的证书,然后从头开始获取SHA-1证书。 (从头开始,我的意思是GoDaddy必须再次validation您的公司和电话号码以及所有这些。)顺便说一句,如果您撤销证书,请确保先向GoDaddy申请许可,因为从技术上讲,他们不必给予你退款了。 另外,我无法获得3年证书,因为在特定日期(2016年?)之后到期的任何内容必须是SHA-2而不是SHA-1。 我基本上不得不获得3年期证书的退款,而是获得1年的证书甚至可以获得SHA-1选项。 但是在使用SHA-1之后,GoDaddy在方法#1中的指示运行良好。 我建议使用keytool命令手动生成CSR(而不是通过Web浏览器自动生成)。 稍后,您只需下载PEM文件并使用keytool命令将其导入密钥库。 (这是GoDaddy在问题中发布的链接中的“方法1”中描述的内容。)

最后,如果您必须重新签发证书并再次执行此过程,我强烈建议您选择除GoDaddy之外的其他公司进行代码签名。 他们的技术支持绝对是可怕的。 他们的支持技术人员甚至向我承认他们没有接受过这方面的培训。 在这个问题上花费的时间大大抵消了证书上节省的任何资金。

 keytool -import -trustcacerts -keystore codesignstore -storepass  -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  -keystore codesignstore -storepass  

其他选择:

 -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  -keystore codesignstore -storepass  

你必须非常小心这里,支持不会告诉你这个..如果你试图导入其他证书与现有的证书,你需要小心你不要把整个事情搞得一团糟。 🙂

如果您确实遇到问题,可以删除别名并再次导入..

 keytool -delete -alias codesigncert -storepass  -keystore codesignstore 

我喜欢做的一件事就是“堆叠”命令以确保我在列表中工作。

例如,你来自Godaddy:

 keytool -import -trustcacerts -keystore codesignstore -storepass  -alias codesigncert -file mycert.cer 

然后,我接受每个命令并将其设置为如下所示“向下”列表:

 keytool -import -trustcacerts -keystore codesignstore -storepass  -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%\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 

注意:运行此操作时,您将看不到它是否成功。

让我们从这里开始看看结果如何……

我发现你从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文件。
  • 删除----BEGIN第一个块----END
  • 在包含其余三个证书的文件上运行keytool -import

普雷斯托!

 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”-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

将请求(mycsr.pem)提交给GoDaddy,下载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 )下载root(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

我使用Chrome / FF java插件从我的网络服务器部署应用程序(因此不是Java小程序)时出现了证书错误(CA不信任)。 在我的Web服务器中添加其他Godaddy(中间)CA证书时,问题解决了。 我和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!

Interesting Posts