2013-01-21 13 views
10

Bez BounceyCastle.Używanie C# do uzyskania klucza publicznego z mojego certyfikatu dla języka Java

Mam mój certyfikat, a wartość GetPublicKey() nie jest tym, czego potrzebuje strona Java w domu.

Certyfikat dla obiektu X509Certificate2 za pomocą szyfrowania DSA. Utworzone przy użyciu MakeCert

Convert.ToBase64String(cert.GetPublicKey()) powraca

AoGAeaKLPS4ktxULg3YQL0ePphF08tKsddZtv3SDERa8b8go5h3AxmWjuDd8y9dIzZFe8KDjY9Lg 
JU4JOA27snO3fCsPAVkmJ0O2pbxn+wzT7oij2FOLcCAjnFNNsoaWrtMv+I4XXl18DyDQLFkZiPx9 
2UyuDzoQTGxgCrPccQPjUgY= 

Convert.ToBase64String(cert.RawData) zostaje przywrócone

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 

Jednak kiedy mój odpowiednik Java pobiera klucz publiczny, wykorzystując ten sam plik cert, dostaje

$ 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----- 

I w ten sposób mój problem. Jak uzyskać tę wartość z mojego certyfikatu?

Dzięki!

+1

Dawida, nie można go zweryfikować, ale teraz jak o base64 z cert.RawData? –

+0

Dzięki, ale bez kości. Dodano odpowiedź powyżej. –

+1

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

Odpowiedz

0

Zobacz Ian Boyd's answer. Dostarcza tylko odpowiedzi, których szukasz na temat kodowania. Zwróć uwagę, że jest to związane z RSA, a nie z DSA, ale zawiera w sobie wszystkie informacje na temat kodowania PEM/DER/ASN.1, co jest Twoim problemem tutaj.

1

Powinieneś użyć cert.PublicKey.EncodedKeyValue zamiast cert.GetPublicKey().

EncodedKeyValue zapewnia wartość zakodowaną w ASN1, a nie dane klucza podstawowego jako GetPublicKey().

Więc można użyć tego kodu

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-----", 
    }); 
} 
Powiązane problemy