2012-08-14 9 views
9

'da okuyun. İstemci kimlik doğrulamasıyla bir tomcat http bağlayıcısı kullanıyorum. Bir istemci, sunucuma yeni bir bağlantı başlatır ve sertifikasını gönderirse, sertifikayı alabilir ve gelen sertifikanın genel adını java kodumda okuyabilir miyim? Evet ise nasıl?Gelen sertifikayı Tomcat

sayesinde mazaneicha için adi

+0

http://www.coderanch.com/t/438788/Security/Read-client-certificate-Servlet bak. İyi şanslar! – mazaneicha

cevap

16

Sen HttpServletRequest üzerinde javax.servlet.request.X509Certificate özelliği alınırken istemci sertifikası zincirini alabilirsiniz. Bu, X509Certificates dizisidir, ilk ilk (konum 0) gerçek istemci sertifikasıdır (ara CA sertifikaları gerekliyse zincirin geri kalanı bulunabilir).

X509Certificate certs[] = 
    (X509Certificate[])req.getAttribute("javax.servlet.request.X509Certificate"); 
// ... Test if non-null, non-empty. 

X509Certificate clientCert = certs[0]; 

// Get the Subject DN's X500Principal 
X500Principal subjectDN = clientCert.getSubjectX500Principal(); 

Ardından this answer açıklandığı gibi bu anapara (örneğin CN) çeşitli rDNS (göreli ayırt edici ad) alabilirsiniz:

import javax.naming.ldap.LdapName; 
import javax.naming.ldap.Rdn; 

String dn = subjectDN.getName(); 
LdapName ldapDN = new LdapName(dn); 
for(Rdn rdn: ldapDN.getRdns()) { 
    System.out.println(rdn.getType() + " -> " + rdn.getValue()); 
} 

(Ayrıca her RDN almak için BouncyCastle en X509Name kullanabilirsiniz.

Bir X.509 sertifikasında, Konu DN, her biri bir dizi AVA (Nitelik Değer Atıfları), örneğin CN=... veya O=... olan sıralı bir RDN dizisidir. Prensipte, RDN başına birden fazla AVA olabilir, bu da sorunlara neden olabilir, ancak bu çok nadirdir. RDN başına yalnızca bir tane AVA olduğunu varsayabilirsiniz. (Belki this answer ilgi olabilir.) Yazının sonuna doğru

+0

teşekkürler, her şey çok iyi çalıştı :-) axis2 kullanan herkes için ve HttpServletRequest: \t MessageContext bağlamında = MessageContext.getCurrentMessageContext(); \t HttpServletRequest requestProperty = (HttpServletRequest) context.getProperty (HTTPConstants.MC_HTTP_SERVLETREQUEST); – adihubba

+0

Req.getAttribute ("javax.servlet.request.X509Certificate") için null olacağım. aynı eşleme alanından istek göndermek için gerekli mi? Yerel (localhost kullanarak) makineden ve geliştirme sunucusundan da denedim. – TechnoCrat

+0

@TechnoCrat Muhtemelen (a) sunucunuzun bir istemci sertifikası istemek/gerektirmek üzere yapılandırılmadığı veya (b) bir istemci sertifikası istendiğinde gönderdiği sertifika yetkilileri listesinin sahip olduğunuz istemci sertifikalarının hiçbiriyle eşleşmediği anlamına gelir. makinende. Gerçekten "alan adı" ile eşleşmiyor, ancak CA eşleşmesi hakkında. – Bruno

0

Kredi:

 String cipherSuite = (String) req.getAttribute("javax.servlet.request.cipher_suite"); 

     if (cipherSuite != null) { 
      X509Certificate certChain[] = (X509Certificate[]) req.getAttribute("javax.servlet.request.X509Certificate"); 
      if (certChain != null) { 
       for (int i = 0; i < certChaNin.length; i++) { 
        System.out.println ("Client Certificate [" + i + "] = " 
          + certChain[i].toString()); 
       } 
      } 
     } 
+0

Önce şifre paketini almanız ve test etmeniz gerekmez. – Bruno