前提・実現したいこと
・前提
JavaでApplePayをWebに実装するシステムを作っています。
ApplePayでは、作成した認証pemファイルを使用し、Appleのサーバに通信をおこわなければなりません。
pemファイルを使用したSSL通信はPHPで行う事ができました。
ですが、Javaでは作成する事がどうしてもできませんでした。
参考サイト:https://mintaku-blog.net/applepay-web/#crayon-5d1072f403b65388217018
・実現したい事
JavaでPemを使用したSSL通信ができる事
発生している問題
PHPでできるpemを使用したSSL認証をJavaでする事ができない
該当のソースコード
参考プログラミング:https://github.com/norfolkmustard/ApplePayJS
<?php $validation_url = $_GET['u']; if( "https" == parse_url($validation_url, PHP_URL_SCHEME) && substr( parse_url($validation_url, PHP_URL_HOST), -10 ) == ".apple.com" ){ require_once ('/your/path/to/applepay_includes/apple_pay_conf.php'); // create a new cURL resource $ch = curl_init(); $data = '{"merchantIdentifier":"'.PRODUCTION_MERCHANTIDENTIFIER.'", "domainName":"'.PRODUCTION_DOMAINNAME.'", "displayName":"'.PRODUCTION_DISPLAYNAME.'"}'; curl_setopt($ch, CURLOPT_URL, $validation_url); curl_setopt($ch, CURLOPT_SSLCERT, PRODUCTION_CERTIFICATE_PATH); //こちらで認証用のpemを追加 curl_setopt($ch, CURLOPT_SSLKEY, PRODUCTION_CERTIFICATE_KEY); //こちらで認証用のpemを追加 curl_setopt($ch, CURLOPT_SSLKEYPASSWD, PRODUCTION_CERTIFICATE_KEY_PASS); //こちらで認証用のpemを追加 curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); if(curl_exec($ch) === false) { echo '{"curlError":"' . curl_error($ch) . '"}'; } // close cURL resource, and free up system resources curl_close($ch); } ?>
Java開発参考にしたサイト
(JavaではPem通信について下記のサイトを参考にしました。 こちらの古いのでうまく動きませんでした)
参考:http://omiya6048.hatenablog.com/entry/2013/05/31/210000
PEMReader pr = new PEMReader(new FileReader("cert.pem")); X509Certificate cert = (X509Certificate) pr.readObject(); PEMReader kr = new PEMReader(new FileReader("privkey.pem"), new PasswordFinder() { public char[] getPassword() { return "passphase".toCharArray(); } }); KeyPair key = (KeyPair) kr.readObject(); KeyStore ksKeys = KeyStore.getInstance("JKS"); ksKeys.load(null, "passphase".toCharArray()); ksKeys.setCertificateEntry("MyCert", cert); ksKeys.setKeyEntry("Mykey", key.getPrivate(), "passphase".toCharArray(), new Certificate[]{cert}); KeyManagerFactory kmf = KeyManagerFactory.getInstance( KeyManagerFactory.getDefaultAlgorithm()); kmf.init(ksKeys, "passphase".toCharArray()); TrustManagerFactory tmf = TrustManagerFactory.getInstance( TrustManagerFactory.getDefaultAlgorithm()); tmf.init(ksKeys); SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); Socket socket = sslContext.getSocketFactory().createSocket( "localhost", 4433); BufferedReader in = new BufferedReader(new InputStreamReader( socket.getInputStream())); PrintWriter out = new PrintWriter(new OutputStreamWriter( socket.getOutputStream())); out.println("Hello World"); System.out.println(in.readLine()); out.close(); in.close();
試したこと
・Javaでpem通信を行う参考資料を試しましたが、コードが古く動きませんでした
参考:http://omiya6048.hatenablog.com/entry/2013/05/31/210000
・PHP内のheaderとbody情報を確認しましたが、headerは無く、bodyは
「'{"merchantIdentifier":"'.PRODUCTION_MERCHANTIDENTIFIER.'", "domainName":"'.PRODUCTION_DOMAINNAME.'", "displayName":"'.PRODUCTION_DISPLAYNAME.'"}'」の内容がありました。
ですが、それをJavaにベタで記入しても動きませんでした。
あなたの回答
tips
プレビュー