Khi nó quay ra, đây là một vấn đề tinh tế, và nó có giá trị đưa ra câu trả lời ở đây trong trường hợp người khác có một cái gì đó tương tự.
Câu trả lời TLDR là tôi không kiểm tra khóa và chứng chỉ của tôi không rỗng và kết quả là đã thêm khóa và chứng chỉ rỗng vào kho khóa. Câu trả lời dài hơn sau. Cách chúng tôi có máy chủ web được thiết lập để sử dụng SSL, đặc biệt để hỗ trợ cấu hình điển hình của người dùng nơi địa chỉ IP được sử dụng để định cấu hình địa chỉ nghe trang web thay vì tên DNS, là nó xác định chứng chỉ khóa-lưu trữ chính sử dụng bí danh và tạo khóa lưu trữ tạm thời chỉ chứa chứng chỉ cho trang web đó, sử dụng khóa khóa đó để định cấu hình ngữ cảnh SSL và nhà máy socket SSL, như vậy:
// CREATE EPHEMERAL KEYSTORE FOR THIS SOCKET USING THE DESIRED CERTIFICATE
try {
final char[] BLANK_PWD=new char[0];
SSLContext ctx=SSLContext.getInstance("TLS");
KeyManagerFactory kmf=KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
Key ctfkey=mstkst.getKey(svrctfals,BLANK_PWD);
Certificate[] ctfchn=mstkst.getCertificateChain(svrctfals);
KeyStore sktkst;
sktkst=KeyStore.getInstance("jks");
sktkst.load(null,BLANK_PWD);
sktkst.setKeyEntry(svrctfals,ctfkey,BLANK_PWD,ctfchn);
kmf.init(sktkst,BLANK_PWD);
ctx.init(kmf.getKeyManagers(),null,null);
ssf=ctx.getServerSocketFactory();
}
catch(java.security.GeneralSecurityException thr) {
throw new IOException("Cannot create server socket factory using ephemeral keystore ("+thr+")",thr);
}
Lưu ý rằng nó sử dụng mật khẩu trống để trích xuất khóa cá nhân và chứng chỉ từ kho khóa chính. Đó là vấn đề của tôi - tôi đã có, từ thói quen sử dụng keytool, tạo cặp khóa riêng với mật khẩu (cùng mật khẩu với kho khóa).
Bởi vì tôi đã có một mật khẩu trên giấy chứng nhận, chìa khóa và giấy chứng nhận không được tách ra, và null được thông qua để sktkst.setKeyEntry(svrctfals,ctfkey,BLANK_PWD,ctfchn);
Tuy nhiên, setKeyEntry
kiểm tra các thông qua Key
sử dụng instanceof
và kết luận (chính xác) rằng null
không phải là một instanceof PrivateKey
, dẫn đến lỗi lầm mà tôi đã thấy.
Mã điều chỉnh kiểm tra rằng một chìa khóa và chứng chỉ được tìm thấy và gửi lỗi thích hợp:
// CREATE EPHEMERAL KEYSTORE FOR THIS SOCKET USING THE DESIRED CERTIFICATE
try {
final char[] BLANK_PWD=new char[0];
SSLContext ctx=SSLContext.getInstance("TLS");
KeyManagerFactory kmf=KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
Key ctfkey=mstkst.getKey(svrctfals,BLANK_PWD);
Certificate[] ctfchn=mstkst.getCertificateChain(svrctfals);
KeyStore sktkst;
if(ctfkey==null) {
throw new IOException("Cannot create server socket factory: No key found for alias '"+svrctfals+"'");
}
if(ctfchn==null || ctfchn.length==0) {
throw new IOException("Cannot create server socket factory: No certificate found for alias '"+svrctfals+"'");
}
sktkst=KeyStore.getInstance("jks");
sktkst.load(null,BLANK_PWD);
sktkst.setKeyEntry(svrctfals,ctfkey,BLANK_PWD,ctfchn);
kmf.init(sktkst,BLANK_PWD);
ctx.init(kmf.getKeyManagers(),null,null);
ssf=ctx.getServerSocketFactory();
}
catch(java.security.GeneralSecurityException thr) {
throw new IOException("Cannot create server socket factory using ephemeral keystore ("+thr+")",thr);
}
Cảm ơn; Tôi sẽ xem xét điều này. –