2011-03-30 8 views
3
나는 락스 내 가제트에 의해 소비 될 것이다 OAuth는 1.0A 서비스를 구축하고

, 그것은이다 닷넷 3.5 응용 프로그램은 C#으로 작성되었습니다.문자열에서 닷넷에서 락스 공개 인증서를로드 (닷넷에서 X509 CERT는에 ASN.1 인코딩 SubjectPublicKeyInfo로 변환하는 방법)

는 락스 내가 X509Certificate의 인스턴스가 공개 인증서를 형성 만들 필요가 요청의 서명을 확인하는 의미 RSA-SHA1 서명 방법을 사용하여이 서비스에 요청을한다. JIRA의 응용 프로그램 내

당신은 (또한 등 락스에 대한 소비자의 키를 가지고있는) 소비자 정보 화면으로 이동하여 공개 인증서를 얻을 수 있으며이 형식의 공개 키를 제공합니다 :

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCObJRTGSZbAo 
jRkvKmm0cwFXnKcPMfR4t/sghvLe/+QVs6TJOz5cUh5UokSqyz 
VeMsL0jomP18ZcR3SPcIFT7xtOGQjLwLk7ghfYSsxjTGs9VxsC 
/PQk5OQRP3v43IxFNF3M2SYhFWJZTOnqrab5AsMh2Kxdv+D69D 
CINXCu5ltQIDAQAB 

을 이 키를 생성하는 Jira 코드를 보면 BEGIN/END 인증서 머리글/바닥 글없이 (아마도) PEM으로 인코딩 된 것을 볼 수 있습니다.

https://studio.atlassian.com/source/browse/OAUTH/trunk/api/src/main/java/com/atlassian/oauth/util/RSAKeys.java?r=HEAD

내가 닷넷 내 X509Certificate의 인스턴스로 (키)이 공용 인증서를로드 할, 그러나 나의 시도는 지금까지 실패 :

RSAKeys.toPemEncoding(consumer.getPublicKey()) 

RSAKeys는 오픈 소스 클래스는 여기있다 .

static readonly Regex stripRegex = new Regex("-----[A-Z ]*-----"); 

public string ConvertFromOpenSsl(string key) 
{ 
    return stripRegex.Replace(key, "").Replace("\r", "").Replace("\n", ""); 
} 

public X509Certificate2 GetConsumerCertificate(IConsumer consumer) 
{ 
    string cert =    
    @"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCObJRTGSZbAo 
    jRkvKmm0cwFXnKcPMfR4t/sghvLe/+QVs6TJOz5cUh5UokSqyz 
    VeMsL0jomP18ZcR3SPcIFT7xtOGQjLwLk7ghfYSsxjTGs9VxsC 
    /PQk5OQRP3v43IxFNF3M2SYhFWJZTOnqrab5AsMh2Kxdv+D69D 
    CINXCu5ltQIDAQAB"; 

    string converted = ConvertFromOpenSsl(cert); 

    var bytes = Convert.FromBase64String(converted); 


    var cert = new X509Certificate2(bytes); // throws here 

을하지만 코드의 마지막 줄에 내가 던진 예외가 : 여기에 코드를 내가 가진 것

System.Security.Cryptography.CryptographicException: Cannot find the requested object. 

    at System.Security.Cryptography.CryptographicException.ThrowCryptogaphicException(Int32 hr) 
    at System.Security.Cryptography.X509Certificates.X509Utils._QueryCertBlobType(Byte[] rawData) 
    at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(Byte[] rawData, Object password, X509KeyStorageFlags keyStorageFlags) 
    at System.Security.Cryptography.X509Certificates.X509Certificate..ctor(Byte[] data) 
    at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(Byte[] rawData) 

내가 초등학교 뭔가를 놓친 거지 확신을,하지만 난 그게 무엇을 생각할 수 입니다.

OK는 상기 조사에이 공개 키의 SubjectPublicKeyInfo로 직렬화하고, 그래서 ASN.1 있다는 표시 UPDATE는,베이스 (64) 중 디폴트 출력이다 (162 바이트 인코딩되지 않은) 코드 Java는 java.security.PublicKey.getEncoded()를 사용합니다.

그렇다면이 공개 키를 래핑하는 X509Certificate2 인스턴스를 만드는 쉬운 방법이 있습니까? 아니면 x509Certificate2 인스턴스를 만들기 위해 공개 키를 넘어서는 추가 메타 데이터가 필요합니까?

답변

0

Jira는 공개 키가 아닌 인증서를 제공해야합니다.

일반적으로 자바 세계는 base64로 인코딩 또는 PEM 인증서를 제공 할 것입니다. .Net의 X509Certificate2는 자동으로 Base64, PEM 또는 바이너리 인증서를로드 할 수 있습니다.

0

RSACryptoServiceProvider을 사용하여 .NET을 통해 XML RSA 인증서를 생성 할 수 있습니다.

https://superdry.apphb.com/tools/online-rsa-key-converter

을 한 후 JIRA에 응용 프로그램 링크를 만드는 데 사용 :이 XML (FromXmlString 방법)을 줄 것이라고 공개 키는이 서비스를 사용하여 예를 들어,을 인코딩 할 필요가있다.

이전에 가지고 XML 형식의 개인 키는 직접 .NET 응용 프로그램 요청을 서명에 사용할 수 있습니다.

저는 개인적으로 DonNetAuth 토큰, 서명 등을위한 라이브러리를 사용했으며 저에게 적합합니다. 내가 만난 유일한 버그는 jql 쿼리에 관한 것이 었는데, 서명이 제대로 작동하려면 약간의 조정이 필요했습니다. 이 도움이 https://answers.atlassian.com/questions/172760/is-there-any-jira-oauth-implementation-example-in-net

희망 :

http://samondotnet.blogspot.sk/2012/12/introduction-to-dotnetauth.html

은 또한이 링크를 참조하십시오 여기에 링크입니다.

관련 문제