2015-12-31 220 views
0

這裏是我的代碼:無法提取X509公鑰證書

import java.security.PublicKey; 
import java.security.spec.InvalidKeySpecException; 
import java.io.UnsupportedEncodingException; 
import java.security.NoSuchAlgorithmException; 
import java.security.spec.X509EncodedKeySpec; 
import java.security.KeyFactory; 

class LoadKey { 
    public static void main(String[] args) 
    throws InvalidKeySpecException, UnsupportedEncodingException, NoSuchAlgorithmException 
    { 
     String cert = "-----BEGIN CERTIFICATE-----\n" + 
         "MIIDITCCAoqgAwIBAgIQT52W2WawmStUwpV8tBV9TTANBgkqhkiG9w0BAQUFADBM\n" + 
         "MQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkg\n" + 
         "THRkLjEWMBQGA1UEAxMNVGhhd3RlIFNHQyBDQTAeFw0xMTEwMjYwMDAwMDBaFw0x\n" + 
         "MzA5MzAyMzU5NTlaMGgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlh\n" + 
         "MRYwFAYDVQQHFA1Nb3VudGFpbiBWaWV3MRMwEQYDVQQKFApHb29nbGUgSW5jMRcw\n" + 
         "FQYDVQQDFA53d3cuZ29vZ2xlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC\n" + 
         "gYEA3rcmQ6aZhc04pxUJuc8PycNVjIjujI0oJyRLKl6g2Bb6YRhLz21ggNM1QDJy\n" + 
         "wI8S2OVOj7my9tkVXlqGMaO6hqpryNlxjMzNJxMenUJdOPanrO/6YvMYgdQkRn8B\n" + 
         "d3zGKokUmbuYOR2oGfs5AER9G5RqeC1prcB6LPrQ2iASmNMCAwEAAaOB5zCB5DAM\n" + 
         "BgNVHRMBAf8EAjAAMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwudGhhd3Rl\n" + 
         "LmNvbS9UaGF3dGVTR0NDQS5jcmwwKAYDVR0lBCEwHwYIKwYBBQUHAwEGCCsGAQUF\n" + 
         "BwMCBglghkgBhvhCBAEwcgYIKwYBBQUHAQEEZjBkMCIGCCsGAQUFBzABhhZodHRw\n" + 
         "Oi8vb2NzcC50aGF3dGUuY29tMD4GCCsGAQUFBzAChjJodHRwOi8vd3d3LnRoYXd0\n" + 
         "ZS5jb20vcmVwb3NpdG9yeS9UaGF3dGVfU0dDX0NBLmNydDANBgkqhkiG9w0BAQUF\n" + 
         "AAOBgQAhrNWuyjSJWsKrUtKyNGadeqvu5nzVfsJcKLt0AMkQH0IT/GmKHiSgAgDp\n" + 
         "ulvKGQSy068Bsn5fFNum21K5mvMSf3yinDtvmX3qUA12IxL/92ZzKbeVCq3Yi7Le\n" + 
         "IOkKcGQRCMha8X2e7GmlpdWC1ycenlbN0nbVeSv3JUMcafC4+Q==\n" + 
         "-----END CERTIFICATE-----\n"; 
     System.out.println(cert); 
     byte[] encodedCert = cert.getBytes(); 
     X509EncodedKeySpec keySpec = new X509EncodedKeySpec(encodedCert); 
     KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
     PublicKey publicKey = keyFactory.generatePublic(keySpec); 
    } 
} 

OpenSSL是能夠通過命令行來解碼X509證書,所以我知道這是一個有效的證書。但Java似乎並不喜歡它,完全一樣。

我已經厭倦了它,沒有拖尾\ n無濟於事。

任何想法?

+0

你有證書爲PEM文本,你在你的電腦的默認字符集是字符串的字節,通過這些字節有沒有關係加密東西到*關鍵*相關的工廠,你到底會發生什麼? –

+0

也許它期待'\ r \ n'?你有沒有試過先從文件中讀取它? – Zymus

+0

@OlegEstekhin - well'cert.getBytes(「UTF-8」)'也沒有幫助。當你在我的文章中說過,OpenSSL('openssl x509 -in mycert.pem -noout -text')可以讀取那些字節就好了,你怎麼能說這些字節與加密的東西沒有關係呢?如果這些字節與字節序列沒有任何關係,如果Java決定拋棄所有的IETF RFC並且制定自己的標準,那麼這是一種非常糟糕的無用語言。 – neubert

回答

5

您錯過了base64解碼部分。

這裏是工作代碼,你需要Apache Commons Codec庫Base64類。

import java.io.ByteArrayInputStream; 
import java.io.InputStream; 
import java.security.PublicKey; 
import java.security.cert.CertificateFactory; 
import java.security.cert.X509Certificate; 

import org.apache.commons.codec.binary.Base64; 

class LoadKey { 
    public static void main(String[] args) 
    throws Exception 
    { 
     String cert = "-----BEGIN CERTIFICATE-----\n" + 
         "MIIDITCCAoqgAwIBAgIQT52W2WawmStUwpV8tBV9TTANBgkqhkiG9w0BAQUFADBM\n" + 
         "MQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkg\n" + 
         "THRkLjEWMBQGA1UEAxMNVGhhd3RlIFNHQyBDQTAeFw0xMTEwMjYwMDAwMDBaFw0x\n" + 
         "MzA5MzAyMzU5NTlaMGgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlh\n" + 
         "MRYwFAYDVQQHFA1Nb3VudGFpbiBWaWV3MRMwEQYDVQQKFApHb29nbGUgSW5jMRcw\n" + 
         "FQYDVQQDFA53d3cuZ29vZ2xlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC\n" + 
         "gYEA3rcmQ6aZhc04pxUJuc8PycNVjIjujI0oJyRLKl6g2Bb6YRhLz21ggNM1QDJy\n" + 
         "wI8S2OVOj7my9tkVXlqGMaO6hqpryNlxjMzNJxMenUJdOPanrO/6YvMYgdQkRn8B\n" + 
         "d3zGKokUmbuYOR2oGfs5AER9G5RqeC1prcB6LPrQ2iASmNMCAwEAAaOB5zCB5DAM\n" + 
         "BgNVHRMBAf8EAjAAMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwudGhhd3Rl\n" + 
         "LmNvbS9UaGF3dGVTR0NDQS5jcmwwKAYDVR0lBCEwHwYIKwYBBQUHAwEGCCsGAQUF\n" + 
         "BwMCBglghkgBhvhCBAEwcgYIKwYBBQUHAQEEZjBkMCIGCCsGAQUFBzABhhZodHRw\n" + 
         "Oi8vb2NzcC50aGF3dGUuY29tMD4GCCsGAQUFBzAChjJodHRwOi8vd3d3LnRoYXd0\n" + 
         "ZS5jb20vcmVwb3NpdG9yeS9UaGF3dGVfU0dDX0NBLmNydDANBgkqhkiG9w0BAQUF\n" + 
         "AAOBgQAhrNWuyjSJWsKrUtKyNGadeqvu5nzVfsJcKLt0AMkQH0IT/GmKHiSgAgDp\n" + 
         "ulvKGQSy068Bsn5fFNum21K5mvMSf3yinDtvmX3qUA12IxL/92ZzKbeVCq3Yi7Le\n" + 
         "IOkKcGQRCMha8X2e7GmlpdWC1ycenlbN0nbVeSv3JUMcafC4+Q==\n" + 
         "-----END CERTIFICATE-----\n"; 

     cert = cert.replace("-----BEGIN CERTIFICATE-----\n", ""); 
     cert = cert.replace("-----END CERTIFICATE-----\n", ""); 
     System.out.println(cert); 

     byte[] encodedCert = cert.getBytes("UTF-8"); 
     byte[] decodedCert = Base64.decodeBase64(encodedCert); 
     CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); 
     InputStream in = new ByteArrayInputStream(decodedCert); 
     X509Certificate certificate = (X509Certificate)certFactory.generateCertificate(in); 

     System.out.println("Subject DN : " + certificate.getSubjectDN().getName()); 
     System.out.println("Issuer : " + certificate.getIssuerDN().getName()); 
     System.out.println("Not After: " + certificate.getNotAfter()); 
     System.out.println("Not Before: " + certificate.getNotBefore()); 
     System.out.println("version: " + certificate.getVersion()); 
     System.out.println("serial number : " + certificate.getSerialNumber()); 

     PublicKey publicKey = certificate.getPublicKey(); 
     System.out.println("PublicKey : \n" + publicKey); 
    } 
} 

輸出

MIIDITCCAoqgAwIBAgIQT52W2WawmStUwpV8tBV9TTANBgkqhkiG9w0BAQUFADBM 
MQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkg 
THRkLjEWMBQGA1UEAxMNVGhhd3RlIFNHQyBDQTAeFw0xMTEwMjYwMDAwMDBaFw0x 
MzA5MzAyMzU5NTlaMGgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlh 
MRYwFAYDVQQHFA1Nb3VudGFpbiBWaWV3MRMwEQYDVQQKFApHb29nbGUgSW5jMRcw 
FQYDVQQDFA53d3cuZ29vZ2xlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC 
gYEA3rcmQ6aZhc04pxUJuc8PycNVjIjujI0oJyRLKl6g2Bb6YRhLz21ggNM1QDJy 
wI8S2OVOj7my9tkVXlqGMaO6hqpryNlxjMzNJxMenUJdOPanrO/6YvMYgdQkRn8B 
d3zGKokUmbuYOR2oGfs5AER9G5RqeC1prcB6LPrQ2iASmNMCAwEAAaOB5zCB5DAM 
BgNVHRMBAf8EAjAAMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwudGhhd3Rl 
LmNvbS9UaGF3dGVTR0NDQS5jcmwwKAYDVR0lBCEwHwYIKwYBBQUHAwEGCCsGAQUF 
BwMCBglghkgBhvhCBAEwcgYIKwYBBQUHAQEEZjBkMCIGCCsGAQUFBzABhhZodHRw 
Oi8vb2NzcC50aGF3dGUuY29tMD4GCCsGAQUFBzAChjJodHRwOi8vd3d3LnRoYXd0 
ZS5jb20vcmVwb3NpdG9yeS9UaGF3dGVfU0dDX0NBLmNydDANBgkqhkiG9w0BAQUF 
AAOBgQAhrNWuyjSJWsKrUtKyNGadeqvu5nzVfsJcKLt0AMkQH0IT/GmKHiSgAgDp 
ulvKGQSy068Bsn5fFNum21K5mvMSf3yinDtvmX3qUA12IxL/92ZzKbeVCq3Yi7Le 
IOkKcGQRCMha8X2e7GmlpdWC1ycenlbN0nbVeSv3JUMcafC4+Q== 

Subject DN : CN=www.google.com, O=Google Inc, L=Mountain View, ST=California, C=US 
Issuer : CN=Thawte SGC CA, O=Thawte Consulting (Pty) Ltd., C=ZA 
Not After: Mon Sep 30 19:59:59 EDT 2013 
Not Before: Tue Oct 25 20:00:00 EDT 2011 
version: 3 
serial number : 105827261859531100510423749949966875981 
PublicKey : 
Sun RSA public key, 1024 bits 
    modulus: 156396091895984667473837837332877995558144703880815901117439532534031286131520903863087599986938779606924811933611903716377206837300122262900786662124968110191717844999183338594373129421417536020806373385428322642107305024162536996222164292639147591878860587271770855626780464602884552232097424473091745159379 
    public exponent: 65537