将.key和.pem文件导入jks文件并在Java / Spring中使用

时间:2016-06-02 17:52:58

标签: java ssl keytool pem jks

我从服务团队获得了以下密钥/证书,通过SSL调用他们的API,我通过curl命令验证了。

view.addSubview(newButton)       //the view that contains your content
scrollView.documentView = view   //triggers everything to be recalculated

CURL命令:

1. QA.test.key
2. QA.test.pem 

现在,要通过https在Java中调用API,我是否需要执行以下操作?

  1. 创建自签名的jks文件
  2. 将.key和.pem导入新的test.jks文件?
  3. 执行以下操作

    curl --key QA.test.key --cert ./QA.test.pem -X POST --header "Content-Type: application/json" --header "Accept: application/json" -d '{"pan":"1234567890123456", "client": " Application Name "}' https://test-qa.abc.com/tokenize
    

    }

  4. 使用jks文件时出现无效证书错误,创建jks文件并导入.key和.pem文件以使其正常工作的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

使用OpenSSL实用程序创建PKCS#12文件。然后,您可以使用系统属性将其指定为密钥库。

CREATE OR REPLACE FUNCTION F_before_insert_detall() RETURNS TRIGGER AS $F_before_insert_detall$
Declare stock INT; 
BEGIN
stock = (select existencias from productos where id_fab=NEW.fab AND id_producto = NEW.producto);
IF NEW.cantidad > stock THEN
NEW.cantidad := stock;
END IF;
NEW.preu := (select precio from productos where id_fab=NEW.fab AND id_producto = NEW.producto);
RETURN NEW;
END;
$F_before_insert_detall$ LANGUAGE plpgsql;

CREATE TRIGGER before_insert_detall BEFORE INSERT ON detall FOR EACH ROW
EXECUTE PROCEDURE F_before_insert_detall();

此命令将提示输入密码以加密新的PKCS#12文件。它还可能会提示用于加密openssl pkcs12 -export -in QA.test.pem -inkey QA.test.key -out test.pkcs12 的密码(如果有)。

javax.net.ssl.keyStore=test.pkcs12
javax.net.ssl.keyStorePassword=<whatever you entered when creating PKCS #12>
javax.net.ssl.keyStoreType=PKCS12

QA.test.key属性是分开的;它们会影响如何验证服务器。如果服务器使用由“真实”CA颁发的证书,则必须在Java运行时中提供必要的证书。否则,您将不得不创建一个额外的密钥库,可以使用Java的trustStore命令来完成。

请注意Java 9 will use PKCS #12 files as the default密钥库类型。

答案 1 :(得分:1)

创建jks的最简单方法是使用GUI工具portecle http://portecle.sourceforge.net

创建JKS&gt;导入密钥/对

您还可以使用keytool和OpenSSL。请检查此importing an existing x509 certificate and private key in Java keystore to use in ssl

考虑您需要一个用于客户端证书的keyStore和一个用于服务器证书的trustStore。通常,客户端证书也包含它们。如果没有,还包括JKS中的证书(与其他文件相同)

要调用并发送json,您可以使用httpsURLconnection

  HttpsURLConnection conn =       (HttpsURLConnection)url.openConnection();
  conn.setSSLSocketFactory(sslFactory);
  conn.setMethod("POST");
  conn.setDoOutput(true);
  conn.setRequestProperty("Content-Type","application/json"); 
  conn.connect();
  OutputStream os = conn.getOutputStream();
  os.write(jsonString.getBytes());
  os.flush();
  os.close(); 

要创建socketFactory,您可以使用

  SSLContext sc = SSLContext.getDefault();
  SSLSocketFactory sslFactory =  sc.getSocketFactory();

这里有一个完整的示例(使用java代码创建信任库和密钥库)How can I use different certificates on specific connections?

如果您遇到SSL连接问题,请添加

 System.setProperty("javax.net.debug", "ssl");