Tomcatサーバー(Linux上)がclient-authentication = on(org.jboss.web.connector.ssl.client-auth = true)で実行されている場合、クライアント(OSX 1.7.3)はJNLPを(ブラウザーで)ダウンロードできます。 )が、java-webstartはJNLPでさえもダウンロードできず、空の証明書選択ダイアログのみが表示されます。
証明書は自己署名のものです。CAとクライアントの証明書はOSXのKeyChainにインポートされます(ca-> system、client + key-> login)
問題をデバッグすると、AppleのJNLP JavaインターフェイスがパスワードなしでOSXのKeyChainキーストアに間違った方法で到達しようとしているようです(*以下の例を参照)
JNLPダウンロード(OSX)で実行中のコードをデバッグすることに基づいて小さなプログラムを作成しました。
import java.security.Key;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.X509Certificate;
import java.util.Enumeration;
import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.X509KeyManager;
public class OSXKeyChainTest {
/**
* Demonstrating issue in OSX-JNLP-Java interface, the keys from the
* KeyChain are not accessed during JNLP downloading phase. But if it would
* use any password it would work (see the FIXME line). This small test
* program is based on the debugging works on OSX 1.7.3.
*/
public static void main(String[] args) throws Exception {
KeyStore ks = KeyStore.getInstance("KeyChainStore", "Apple");
ks.load(null, new char[0]);
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509", "SunJSSE");
// FIXME !!!! try it with ANY password, and it will work, eg. = new char[] {'x'};
char[] password = new char[] {};
// as AppleX509DeployKeyManager.getBrowserKeyManager() does
keyManagerFactory.init(ks, password);
X509KeyManager localX509KeyManager = null;
KeyManager[] arrayOfKeyManager = keyManagerFactory.getKeyManagers();
int i = 0;
while (i < arrayOfKeyManager.length) {
if ((arrayOfKeyManager[i] instanceof X509KeyManager)) {
localX509KeyManager = (X509KeyManager) arrayOfKeyManager[i];
break;
}
i++;
}
for (Enumeration<String> t = ks.aliases(); t.hasMoreElements();) {
String alias = t.nextElement();
System.out.println("@Alias: " + alias);
if (ks.isKeyEntry(alias)) {
System.out.println("It's a key entry");
for (Certificate c : ks.getCertificateChain(alias)) {
X509Certificate x509 = (X509Certificate) c;
System.out.println(x509.getSubjectDN().toString());
System.out.println("SN: " + x509.getSerialNumber());
}
// as SunX509KeyManagerImpl does
Key localKey = ks.getKey(alias, password);
System.out.println("Localkey: " + localKey);
}
}
System.out.println("--------------------------------");
System.out.println("It should be not null!: " + localX509KeyManager.getPrivateKey("client"));
}
}