2012-11-02 58 views
2

在Java中你如何從HttpRequest的SSL證書中提取「頒發給」或用戶?Java如何從HttpRequest中的SSL證書中提取「頒發給」或用戶?

什麼我的工作:

Object certChain = request 
    .getAttribute("javax.servlet.request.X509Certificate"); 
if (certChain != null) 
{ 
    X509Certificate certs[] = (X509Certificate[]) certChain; 
    X509Certificate cert = certs[0]; 
    String user = cert.getSubjectDN().getName(); 
} 
+2

是的,就是這樣。你有什麼問題? – erickson

+0

@erickson我只需要確認這確實是這樣做的正確方法 – stackoverflow

回答

2

下面的代碼來提取「頒發給」又名爲一個HttpRequest內的證書主題,

import java.security.cert.X509Certificate; 
import javax.naming.InvalidNameException; 
import javax.naming.ldap.LdapName; 
import javax.naming.ldap.Rdn; 

X509Certificate[] certs = (X509Certificate[])request.getAttribute("javax.servlet.request.X509Certificate"); 
if ((certs == null) || (certs.length == 0)) { 
    return null; 
} 

String name = certs[0].getSubjectX500Principal().getName(); // if you are looking for issuer then use cert[0].getIssuerX500Principal().getName(); 
LdapName ldapName = null; 
try { 
    ldapName = new LdapName(name); 
} catch (InvalidNameException e) { 
    throw new RuntimeException(e); 
} 

for (Rdn rdn : ldapName.getRdns()) { 
    String type = rdn.getType(); 
    if ("CN".equals(type)) { 
     String issuedTo = (String)rdn.getValue(); 
    } 
} 

JDK 6具有API getSubjectX500Prinicpal()在它的rt.jar中本地,不知道以前的版本, enter image description here

+0

我的編譯器找不到方法getSubjectX500Principal()這是什麼庫?以及如何從HttpRequest對象中獲取此信息 – stackoverflow

+0

我沒有遇到任何編譯器問題。我正在使用JDK 6,此類可在rt.jar – Arham

+0

中使用哪種版本的編譯器? – Arham

2

getSubjectDN()不應再使用。

Denigrated,由getSubjectX500Principal()取代。

所以使用:

cert[0].getSubjectX500Principal().getName(); 

這裏是getSubjectX500Principal()的Javadoc。

+0

作爲一方,我不得不去查找在JavaDoc中使用時的'Denigrated'。似乎基本上是一種不太嚴重的「棄用」形式。至少根據[本Bug報告](http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5008142)瞭解它。 –

+0

@stackoverflow我有一個錯字,很抱歉。作爲一個人,我問了一個關於[程序員關於整個Denigrated事物]的問題(http://programmers.stackexchange.com/q/173396/1287),你可能想看看它。 –

+0

感謝您的迴應jschoen – stackoverflow

相關問題