/ / जावा में CA के खिलाफ X.509 प्रमाणपत्र प्रमाणित करें - जावा, ssl, x509certificate, x509, x509trustmanager

जावा में सीए के खिलाफ X.50 9 प्रमाण पत्र मान्य करें - जावा, एसएसएल, x509 प्रमाण पत्र, x509, x509trustmanager

आइए बताते हैं कि मेरे पास ऐसा कुछ है (क्लाइंट साइड कोड):

TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {

@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}

@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}

@Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
}
};

SSLContext sslc = SSLContext.getInstance("TLS");
sslc.init(null, trustAllCerts, null);

SocketFactory sf = sslc.getSocketFactory();
SSLSocket s = (SSLSocket) sf.createSocket("127.0.0.1", 9124);

यह कोड पूर्ण कार्यात्मक है, लेकिन मैं वास्तव में यह पता नहीं लगा सकता कि सर्वर के प्रमाण पत्र को एक ठोस CA प्रमाणपत्र के खिलाफ कैसे मान्य किया जाए जो मैंने pem फ़ाइल में उपलब्ध है।

सभी प्रमाणपत्रों पर मेरे स्व-हस्ताक्षरित सीए द्वारा हस्ताक्षर किए गए हैं, और यह सीए है जिसे मुझे (केवल इस एक के खिलाफ) को मान्य करने की आवश्यकता है।

हर उत्तर की सराहना की है।

संपादित करें:

के जवाब में jglouie (इस तरह से बहुत-बहुत धन्यवाद - अपना जवाब नहीं दे सकते)।

मैंने समाधान की स्थापना की:

new X509TrustManager() {

@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}

@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}

@Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] certs, String authType)
throws CertificateException {
InputStream inStream = null;
try {
// Loading the CA cert
URL u = getClass().getResource("tcp/cacert.pem");
inStream = new FileInputStream(u.getFile());
CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509Certificate ca = (X509Certificate) cf.generateCertificate(inStream);
inStream.close();

for (X509Certificate cert : certs) {
// Verifing by public key
cert.verify(ca.getPublicKey());
}
} catch (Exception ex) {
Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
} finally {
try {
inStream.close();
} catch (IOException ex) {
Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
}
}

}
}
};

उत्तर:

उत्तर № 1 के लिए 1 9

मैं मानता हूं कि आपके CA का स्व-हस्ताक्षरित प्रमाणपत्र पहले से ही लोड है:

CertificateFactory cf = CertificateFactory.getInstance("X.509");
FileInputStream finStream = new FileInputStream("CACertificate.pem");
X509Certificate caCertificate = (X509Certificate)cf.generateCertificate(finStream);

फिर प्रमाण पत्र की जांच करने की विधि में:

@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType)  throws CertificateException {

if (certs == null || certs.length == 0) {
throw new IllegalArgumentException("null or zero-length certificate chain");
}

if (authType == null || authType.length() == 0) {
throw new IllegalArgumentException("null or zero-length authentication type");
}

//Check if certificate send is your CA"s
if(!certs[0].equals(caCertificate)){
try
{   //Not your CA"s. Check if it has been signed by your CA
certs[0].verify(caCertificate.getPublicKey())
}
catch(Exception e){
throw new CertificateException("Certificate not trusted",e);
}
}
//If we end here certificate is trusted. Check if it has expired.
try{
certs[0].checkValidity();
}
catch(Exception e){
throw new CertificateException("Certificate not trusted. It has expired",e);
}
}

अस्वीकरण: कोड संकलित करने के लिए भी प्रयास नहीं किया है


जवाब के लिए 3 № 2

स्वीकृत उत्तर अत्यंत गलत है। यह सर्वर सर्टिफिकेट और विश्वसनीय सर्टिफिकेट अथॉरिटी के बीच किसी भी संबंध को क्रिप्टोग्राफिक रूप से सत्यापित नहीं करता है। सामान्य तौर पर, आपको अपने खुद के ट्रस्टमैनेजर को लागू करने की आवश्यकता नहीं होनी चाहिए, ऐसा करना बेहद खतरनाक है।

जैसा कि EJP ने कहा, "अपने खुद के ट्रस्टमैनेजर को लागू करने की कोई आवश्यकता नहीं है, आप बस डिफ़ॉल्ट एक का उपयोग कर सकते हैं, और सुनिश्चित करें कि आपके डिफ़ॉल्ट TrustStore में विश्वसनीय CA प्रमाणपत्र जोड़ा गया है। यह प्रश्न अधिक जानकारी के लिए।

पर एक नज़र डालें CertPathValidator JDK से वर्ग, जो एक विश्वसनीय CA के माध्यम से सर्वर के स्वयं के प्रमाणपत्र से विश्वास की एक सतत श्रृंखला की पुष्टि करता है Oracle के डॉक्स प्रमाण पत्र श्रृंखला सत्यापन के लिए एक परिचय के लिए।


उत्तर के लिए -5 № 3

यह कोड पूरी तरह कार्यात्मक है

यह कोड पूरी तरह से है बेकार। यह पूरी तरह से असुरक्षित है, साथ ही अपने स्वयं के विनिर्देश के अनुरूप भी नहीं है। शायद ही कभी अपने खुद के ट्रस्टमैन की आपूर्ति करने की आवश्यकता होती है, डिफ़ॉल्ट एक बहुत अच्छी तरह से काम करता है।

आपको केवल यह सुनिश्चित करने की आवश्यकता है कि आपके पास जो CA प्रमाणपत्र है वह आपके ट्रस्टस्टोर में मौजूद है, और फिर सिस्टम गुण सेट करें javax.net.ssl.trustStore यह इंगित करने के लिए कि क्या यह "डिफ़ॉल्ट जावा ट्रस्टस्टोर फ़ाइल नहीं है। आपको डॉन" टी किसी भी कोड को लिखने की आवश्यकता है System.setProperty(), अगर आप इसे कमांड लाइन -D विकल्प के माध्यम से सेट नहीं करते हैं।

संपादित करें आपके "समाधान" ने निश्चित रूप से सामान्य रूप से काम नहीं किया। यह मानता है कि श्रृंखला के प्रत्येक प्रमाण पत्र पर आपके प्रमाणपत्र द्वारा हस्ताक्षर किए गए हैं। अगर हस्ताक्षर प्रमाणपत्र = आपके प्रमाणपत्र की लंबाई 1, या लंबाई 2 की श्रृंखला के लिए ही सही हो सकता है