JAva pkcs#11証明書の読み取りと復号化(初学-共有)

6445 ワード

USB-KEYを挿入し、HttpClientでhttpリクエストをサーバに送信したい.
 
一、httpClientはjava証明書ファイルしかサポートできません.彼が提供した例は以下の通りです.
        DefaultHttpClient httpclient = new DefaultHttpClient();

        KeyStore trustStore  = KeyStore.getInstance(KeyStore.getDefaultType());        
        FileInputStream instream = new FileInputStream(new File("my.keystore")); 
        try {
            trustStore.load(instream, "nopassword".toCharArray());
        } finally {
            instream.close();
        }
        SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore);
        Scheme sch = new Scheme("https", socketFactory,443);
        httpclient.getConnectionManager().getSchemeRegistry().register(sch);

USB-KEYのドライバがPKCS#11インタフェースをサポートしている場合、OpenSSLはengineでUSB-KEYに比較的容易にアクセスできます.
 1     public static void main(String[] args) throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException, UnrecoverableKeyException {
 2 //
 3         String pkcs11config="name=PKCS11/n" +
 4                             "library=C://WINDOWS//system32//GP_IFD.dll"; 
 5         byte[] pkcs11configbytes=pkcs11config.getBytes();
 6         ByteArrayInputStream configStream = new ByteArrayInputStream(pkcs11configbytes);
 7         
 8         Provider p = new sun.security.pkcs11.SunPKCS11(configStream);
 9         Security.addProvider(p);
10         char[] pin = "password".toCharArray();
11         KeyStore ks = KeyStore.getInstance("PKCS11");
12         ks.load(null, pin);
13         System.out.println( ks );
14         
15         KeyStore keyStore  = KeyStore.getInstance(KeyStore.getDefaultType());
16         
17         Enumeration enumeration = keyStore.aliases();
18         while (enumeration.hasMoreElements()) {
19             String alias = (String) enumeration.nextElement();
20             System.out.println("----alias---:"+alias);
21             X509Certificate certificate = (X509Certificate)keyStore.getCertificate(alias);
22             System.out.println("----certificate---:"+certificate);
23             PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, null);
24             System.out.println("----privateKey---:"+privateKey);
25         }
26 
27     }

どのメーカーがこのインタフェースを実現したのか分からないが、安全にかかわる以上、みんなはそんなに友好的ではない.私は次のコードで農業銀行のKEY宝(メーカーは華大)にアクセスして、間違いを報告しました.
Exception in thread "main"java.security.ProviderException: Initialization failed at sun.security.pkcs11.SunPKCS11.(SunPKCS11.java:186) at sun.security.pkcs11.SunPKCS11.(SunPKCS11.java:80) at cn.com.hd.test.pkcs11.main(pkcs11.java:65) Caused by: java.io.IOException: ???????¨????ò??
at sun.security.pkcs11.wrapper.PKCS11.connect(Native Method) at sun.security.pkcs11.wrapper.PKCS11.(PKCS11.java:125) at sun.security.pkcs11.wrapper.PKCS11.getInstance(PKCS11.java:138) at sun.security.pkcs11.SunPKCS11.(SunPKCS11.java:128) ... 2 more
 
このインタフェースはまったくサポートされていないでしょう.
 
二、最新バージョンのOpenSSL 0.9.8 iバージョンはすでにWINDOWS CAPIのサポートを増やしたそうです.誰かがテストを行います.
USB-KEYに対する試験を行う(特に、試験用のUSB-KEYは公安専用であるため、初めてUSB-KEYにアクセスする際にはKEYのパスワード入力を要求し、公安イントラネットで試験を行う.)
1、新しくコンパイルしたソフトウェアでHTTPSページ要求を開始し、ソフトウェアは公安KEYのパスワード入力ウィンドウをポップアップする.(CAPIにアクセスし、USBに正常にアクセスしたことを証明できます).
2、パスワードを入力して戻ってきたページにはUSB-KEYマスターのメッセージが入っています.(USB-KEYサポート成功が証明されました)
3、USB-KEYをダイヤルして、再度このページを要求する.戻ってきたページには、個人情報は一切表示されず、ログインウィンドウに直接ジャンプします.
4、再度挿入(テストソフトは再起動しない)して、再びHTTPSを要求して、またパスワード入力ウィンドウが現れて、パスワードを入力した後、正常にページにアクセスして、ページの中にUSB-KEYマスターの情報がある.
5、再度このページを要求して、パスワード入力ウィンドウが現れなくて、ページは正常に戻って、つまり同じUSB-KEY主人の情報を持っています.
以上の5ステップのテストにより、新しくコンパイルされたOPENSSL 0.9.8 iバージョンがCAPIに自動的に呼び出されることを証明しました.これはOPENSSLでCAPIインタフェースをサポートする必要がある開発者にとって福音であり、少なくとも私にとって、自分でコードを書く必要はなく、テストする必要があります.
このバージョンはWINDOWSのCAPIインタフェースしかサポートされていないようで、LINUXの下ではよくわかりません.ここまで言うと、OPENSSLオープンソースの原則に基づいて、私のテストの経緯を皆さんの参考にします.今後、似たようなニーズのある方は試してみてください.
 
OpenSSLのBIOライブラリを呼び出してセキュリティ接続と非セキュリティ接続を確立する方法については、以下を参照してください.
http://www.ibm.com/developerworks/cn/linux/l-openssl.html
 
しかし、これらはすべてCの方式で、もともとhttpClientで要求を提出したいと思っていましたが、良いjavaの方法はありませんか?
転載先:https://www.cnblogs.com/sunfb/archive/2013/02/28/2937227.html