使用SSL证书调用Web服务

时间:2018-07-29 15:38:16

标签: java rest web-services curl ssl-certificate

如何在Java中使用下面提到的ssl证书调用相同的Web服务?

curl -v --cert kkk.cer --key kkk.private --pass kkk --cacert sslservercachain.cer -H“内容类型:application / x-www-form-urlencoded” https://hello-signs.api-dev.myname.com/v2/oauth2/client_credential/accesstoken?grant_type=client_credentials -d“ client_id = xxccvvbbnniioopp&client_secret = zoopopopopopppp”

1 个答案:

答案 0 :(得分:0)

元:我认为这至少是部分虚假-我已经看到(不少)变体,但现在找不到。如果我愿意的话,可以稍后再添加(或其他人随意添加)。

对此可能有成千上万的答案,因为似乎几乎每个有计算机的人都编写了自己的HTTP客户端(包括HTTPS)库,并且实际上在各种情况下Java都可以使用几种SSL / TLS实现。为简单起见,我将仅显示内置于标准Sun / Oracle / OpenJDK Java 中的那些:HttpsURLConnection类,该类基于JSSE SSL / TLS实现。 (其他Java实现(例如Android,IBM,也许还有Apple)在这里可能有所不同,但至少Android可能不会使用curl。)

这也取决于您当前拥有的文件,而这些文件又取决于您使用的curl的版本-curl支持大约十二个SSL / TLS堆栈,这些堆栈使用各种文件格式。由于您没有提供此信息,因此我猜您的curl使用openssl(或其分支之一),而opensl则使用--cert --key --cacert的PEM格式文件。如果不是,请编辑您的问题以包括此信息(为了安全起见,请问我;我不确定是否收到有关Q编辑的通知)。

请注意以下事项:

要在JSSE(和HttpsURLConnection)中使用SSL / TLS证书和密钥,您需要将它们放在Java格式的文件中或内存中合适的Java对象中。前者通常更容易,所以我将展示它。首先使用OpenSSL将客户端密钥PLUS证书转换为PKCS12 :

openssl pkcs12 -export -in kkk.cer -inkey kkk.private -out kkk.pkcs12 
# use a different filename if you prefer
# enter passwords as needed; do _not_ use an empty password for the pkcs12
# (if so OpenSSL will create a file Java cannot decrypt, defeating your goal)

对于Java 9而言,这就足够了;默认情况下,它们对密钥库使用PKCS12格式。旧版本默认情况下使用JKS格式,尽管Java 8的较新更新有误:即使您指定或默认使用JKS格式,它实际上也可以读取PKCS12格式-请参见文件{中的keystore.compat项{1}}。甚至在Java允许您在使用时指定 PKCS12格式之前,但是如果发现它不方便,您可以使用以下方法将PKCS12格式转换为JKS格式:

JRE/lib/security/java.security

还希望在密钥库文件中使用用于验证服务器的证书;为了清楚起见,这通常是一个单独的文件,通常称为“信任库”而不是“密钥库”。在这种情况下,您需要使用keytool -importkeystore -srckeystore kkk.pkcs12 -srcstoretype pkcs12 -destkeystore kkk.jks # use the same password for output (jks) as input (p12) otherwise # you may create a privatekey entry that cannot be used later ,并且一次只能做一个证书。如果keytool顾名思义包含多个证书,则必须将它们拆分为单独的文件(在大多数Linux和其他Unix sslservercachain上可以轻松做到这一点,否则任何文本编辑工具都可以管理),然后执行每个

csplit

与上面对于Java 9+的情况一样,这将创建pkcs12,您应该相应地命名它。在Java 8中,它将默认为JKS,但是您可以指定keytool -import -keystore trust.<see below> -alias <unique> -file <filename> # use a unique alias for each cert: if you know what they are, # names like intermediate, root, bridge, etc may be helpful; # otherwise just use arbitrary names like a b c or 1 2 3 . (并再次相应地命名)。在Java 8以下,您必须使用JKS(那些在 did 版本中的提供程序支持pkcs12来用于私钥条目,而不是用于受信任证书条目)。

准备好这些文件并将其设置为系统属性后,使用-storetype pkcs12创建具有所需标题,正文和方法的URL HttpsURLConnection自动设置为curl -d -顺便说一句,它也设置了表单编码,因此您实际上并不需要在curl中显式地执行此操作,但是您确实需要在Java中执行。有关基类URLConnection及其链接子类(HttpURLConnection和HttpsURLConnection)的信息,请参见javadoc。如果您具有Java IDE(例如Eclipse或Intellij),则当您开始输入代码时,这些javadocs应该会自动出现。

POST