2013-01-21 20 views
10

公鑰沒有BounceyCastle用C#從我的證書爲Java

我有我的證書,並且GetPublicKey()值不是什麼房子需要Java端。

的證書如果X509Certificate2對象,使用DSA加密。使用makecert

Convert.ToBase64String(cert.GetPublicKey())返回

AoGAeaKLPS4ktxULg3YQL0ePphF08tKsddZtv3SDERa8b8go5h3AxmWjuDd8y9dIzZFe8KDjY9Lg 
JU4JOA27snO3fCsPAVkmJ0O2pbxn+wzT7oij2FOLcCAjnFNNsoaWrtMv+I4XXl18DyDQLFkZiPx9 
2UyuDzoQTGxgCrPccQPjUgY= 

Convert.ToBase64String(cert.RawData)回報

MIICxjCCAoagAwIBAgIQbdIpaaU9rZdA+wJKA+mUfDAJBgcqhkjOOAQDMBYxFDASBgNVBAMTC0RT 
QSBSb290IENBMB4XDTEzMDExMDE3MTAzNVoXDTM5MTIzMTIzNTk1OVowFDESMBAGA1UEAxMJVXNl 
ciBOYW1lMIIBtzCCASwGByqGSM44BAEwggEfAoGBALWn4Iyvn7LFkV9ULoZtwJ8J1c+ibsbhjPiw 
+xUgRW2LAZV2/Lv89W1jCprNkf87tN/ogMT/1VSIOo7ff/tqVRTWPVJ1ZMrR9VOnF2k/Sorg8Cmr 
sAClsSWrACKIwK2XKJGWTU4oMLxvYcu85+yQ4nWLofgA/+WARrJ/rk2aUSZ3AhUAlqPLNh6JZkpD 
G/OXKzhsZFUiDrkCgYEAoICjHltWOgN8/2uyAaMTNrBuJfi/HM9AWe5B8m9HDfl1K6Qx2Ni6tbYP 
uFtvHdGnoqqn46l7eY+xjpi5GEydvkPtAQKmTDGcSh6vtnTeNV15Hafg5pXUKw1OisIr/bpx/KIk 
cgCtSo6qC5IhDzeZXnfJYcE+8U+O6hEr5dwByN4DgYQAAoGAeaKLPS4ktxULg3YQL0ePphF08tKs 
ddZtv3SDERa8b8go5h3AxmWjuDd8y9dIzZFe8KDjY9LgJU4JOA27snO3fCsPAVkmJ0O2pbxn+wzT 
7oij2FOLcCAjnFNNsoaWrtMv+I4XXl18DyDQLFkZiPx92UyuDzoQTGxgCrPccQPjUgajWTBXMAwG 
A1UdEwEB/wQCMAAwRwYDVR0BBEAwPoAQmhMLkJ/cPXGitvGMB81tZaEYMBYxFDASBgNVBAMTC0RT 
QSBSb290IENBghDCpMJ75zgZokJVlZmNq/LTMAkGByqGSM44BAMDLwAwLAIUYUALM9WhgwzRMj1y 
MSdoparmYvICFFxLgFr2ow3NGTkqWvHIXtjO9R0G 

然而,當我的Java對方獲得公共密鑰,使用相同的證書文件,獲取

$ cat david-509.cer | openssl x509 -pubkey 
-----BEGIN PUBLIC KEY----- 
MIIBtzCCASwGByqGSM44BAEwggEfAoGBALWn4Iyvn7LFkV9ULoZtwJ8J1c+ibsbh 
jPiw+xUgRW2LAZV2/Lv89W1jCprNkf87tN/ogMT/1VSIOo7ff/tqVRTWPVJ1ZMrR 
9VOnF2k/Sorg8CmrsAClsSWrACKIwK2XKJGWTU4oMLxvYcu85+yQ4nWLofgA/+WA 
RrJ/rk2aUSZ3AhUAlqPLNh6JZkpDG/OXKzhsZFUiDrkCgYEAoICjHltWOgN8/2uy 
AaMTNrBuJfi/HM9AWe5B8m9HDfl1K6Qx2Ni6tbYPuFtvHdGnoqqn46l7eY+xjpi5 
GEydvkPtAQKmTDGcSh6vtnTeNV15Hafg5pXUKw1OisIr/bpx/KIkcgCtSo6qC5Ih 
DzeZXnfJYcE+8U+O6hEr5dwByN4DgYQAAoGAeaKLPS4ktxULg3YQL0ePphF08tKs 
ddZtv3SDERa8b8go5h3AxmWjuDd8y9dIzZFe8KDjY9LgJU4JOA27snO3fCsPAVkm 
J0O2pbxn+wzT7oij2FOLcCAjnFNNsoaWrtMv+I4XXl18DyDQLFkZiPx92UyuDzoQ 
TGxgCrPccQPjUgY= 
-----END PUBLIC KEY----- 

創建因此我的問題。我如何從我的證書中獲得這個價值?

謝謝!

+1

大衛,無法驗證它,但現在怎麼樣cert.RawData的BASE64? –

+0

謝謝,但沒有骰子。上面添加了回覆。 –

+1

和cert.PublicKey.Key.ToXmlString(false)? –

回答

0

Ian Boyd's answer。它只是提供了你想要的關於編碼的所有答案。請注意,它與RSA而不是DSA有關,但它提供了有關PEM/DER/ASN.1編碼的所有信息,這是您的問題。

1

您應該使用cert.PublicKey.EncodedKeyValue而不是cert.GetPublicKey()

EncodedKeyValue提供ASN1編碼值,而不是原始密鑰數據,如GetPublicKey()

所以,你可以使用此代碼

void ExportPublicKey(X509Certificate2 cert, string filePath) 
{ 
    byte[] encodedPublicKey = cert.PublicKey.EncodedKeyValue.RawData; 
    File.WriteAllLines(filePath, new[] { 
     "-----BEGIN PUBLIC KEY-----", 
     Convert.ToBase64String(encodedPublicKey, Base64FormattingOptions.InsertLineBreaks), 
     "-----END PUBLIC KEY-----", 
    }); 
}