public String decrypt(String cipher, String serverCert) {
cat.debug("start decrypt");
try {
byte[] b = Base64.decode(cipher);
cat.debug("chiper = " + Dump.getDump(b));
p11 = new PKCS11Sign();
byte[] cleartext = p11.decrypt("kansaieigyo/kansaieigyo", b);
cat.debug("cleartext = " + Dump.getDump(cleartext));
// 暗号が解けたのであるが、これをさらにサーバの公開キーで暗号化する。
byte[] bincert = Base64.decode(serverCert);
X509Certificate svrCert = null;
try {
svrCert = p11.getX509Certificate(bincert);
} catch(Exception ex) { ex.printStackTrace(); }
byte [] reciphered = p11.encrypt(cleartext, svrCert);
return Base64.encode(reciphered);
} catch(Exception e) { e.printStackTrace(); }
return null;
}
これを呼ぶ側のjavascriptでは
function decryptCommonKey() {
var cleartext = document.myApplet.decrypt(encryptedCommonKey, serverCert);
}
とする。
そうすると以下のような結果が得られる。
一度平文にしたものをさらにサーバの公開キーで暗号化しているのは、安全性の
ため。これで解読するのは、3DES等の共通キーで、本当の文書を暗号化する場合に
これは使い捨てのような形で生成される。しかしこの共通キーを相手に安全に渡すのにRSAを
使うのである(これがSMIMEやX500などでの習慣である)。
ここで利用しているPKCS11なるクラスは、melutil.jarなるjarファイルにライブラリ的にあるものでアプレットのロード時に
<applet code="jp.co.melange.sdp.applet.SignApplet" archive="sdpapplet.jar,log4j-1.2.6.jar,melutil.jar" width="320" height="200" name="myApplet"> </applet>
のように指定している。
上記のものは、関西営業の人物のキーを使うものであるが、これはGUIで選択したりというふにう拡張可能である。
2010-04-29 06:52:49,518(Thread-4) [SignApplet.java:61]- chiper =
0000: 21 19 0c af df 7b 49 35 4b fd c4 eb e8 b0 f9 ab !....{I5 K.......
0010: 8c d2 3c ff cf e2 cd 2d e5 4e 3c 4f 0e 60 65 d8 ..<....- .N0020: 74 9e 3b 22 e0 54 65 70 a8 ba e7 05 bd 60 4c 33 t.;".Tep .....`L3
0030: 0a 65 9b d9 f8 8a fc f4 48 33 47 ed df 23 70 01 .e...... H3G..#p.
0040: f4 27 f5 c6 be 8f ba 94 f5 f5 11 73 e5 2e 54 a9 .'...... ...s..T.
0050: bd dd 2e 66 a5 f7 54 71 3a f9 eb 18 d1 82 b2 91 ...f..Tq :.......
0060: 25 a6 88 58 84 21 6e 1b e1 b9 40 83 c1 e3 28 c4 %..X.!n. ..@...(.
0070: 7b 94 b9 9c 7e 7d 8a ee f3 f0 c4 98 0d a6 43 32 {...~}.. ......C2alias=sdp-test
alias=kansaieigyo/kansaieigyo
after decipher:2010-04-29 06:52:49,760
(Thread-4) [SignApplet.java:64]- cleartext =
0000: 2f 07 6b ea dc 6d 8a 9d 37 15 a8 d6 64 c2 ec 8c /.k..m.. 7...d...
0010: 73 70 ce 4a 8f 8f 9d 01 sp.J....]
ただしアプレットのような外部から(オンラインで)引っ張ってきたプログラムに各種のローカルの資源を
自由にアクセスさせるのは危険であるから、java appletではかなり厳しいアクセス制限が課されている。
したがって、これを実行させるクライアントUNIXマシーンの/usr/java/default/jre/lib/security/java.policyファイルには
// melange add
permission java.lang.RuntimePermission "accessClassInPackage.sun.security.pkcs11";
permission java.io.FilePermission "/etc/pki/nssdb/mypkcs11.config", "read";
permission java.io.FilePermission "/usr/lib64/libsoftokn3.so", "read";permission java.security.SecurityPermission "insertProvider.SunPKCS11-NSS";
permission java.security.SecurityPermission "authProvider.SunPKCS11-NSS";
permission java.security.SecurityPermission "removeProvider.SunPKCS11-NSS";
のような記述を追加しておくこと。/etc/pki/nssdb/mypkcs11.configには、
name = NSS
slot = 2
library = /usr/lib64/libsoftokn3.so
nssArgs = "configdir='/etc/pki/nssdb' certPrefix='' keyPrefix='' secmod='secmod.db' flags=readOnly"
のような設定がある。
Browserの種別や、OSの種別を区別することで、configファイルの配置を変更できるようにするつもりである。
現在のこの関係で弊社が開発してきたものは、
CAPI用(Active X)==>IEのみ対応
SUNのpkcs11==>mozillaのみ(WindowsではIEでもいけるようにできるはず)
電子入札用のapplet + jniのペアである<==これはIEでもMozilla, NSでもOK





