2017-10-29 11 views
0

이 라이브러리 (node-jwks-rsa)를 사용하여 my auth0 jwks.json 파일에서 JWT 키를 가져 와서 인증 절차가 실제로 인증 기관에서 나온 후 id_token my 응용 프로그램이 검색하는지 확인합니다. 후드 아래에서JWT 공개 키 대 개인 키 서명 유효성 검사 - 차이점은 무엇입니까?

는합니다 (.jwks 파일에서 인수로 x50c 사용) 공개 키 PEM

export function certToPEM(cert) { 
    cert = cert.match(/.{1,64}/g).join('\n'); 
    cert = `-----BEGIN CERTIFICATE-----\n${cert}\n-----END CERTIFICATE-----\n`; 
    return cert; 
} 

를 구축하기 위해이 방법을 사용합니다.

다음은 jsonwebtoken과 함께 사용하여 JWT (id_token)가 유효한지 확인합니다.

이 확인 방법은 jwks.json 파일의 모듈과 지수에서 개인 키 (RSA)를 생성하고 확인을 위해 대신 사용하는 것과 어떻게 다른가요? 개조 및 지수 (http://stackoverflow.com/questions/18835132/xml-to-pem-in-node-js 찍은)으로부터 PEM을 생성 데모 같은 기능은 또한 여기

(예를 들어,이 library 참조)

export function rsaPublicKeyToPEM(modulusB64, exponentB64) { 
    const modulus = new Buffer(modulusB64, 'base64'); 
    const exponent = new Buffer(exponentB64, 'base64'); 
    const modulusHex = prepadSigned(modulus.toString('hex')); 
    const exponentHex = prepadSigned(exponent.toString('hex')); 
    const modlen = modulusHex.length/2; 
    const explen = exponentHex.length/2; 

    const encodedModlen = encodeLengthHex(modlen); 
    const encodedExplen = encodeLengthHex(explen); 
    const encodedPubkey = '30' + 
     encodeLengthHex(modlen + explen + encodedModlen.length/2 + encodedExplen.length/2 + 2) + 
     '02' + encodedModlen + modulusHex + 
     '02' + encodedExplen + exponentHex; 

    const der = new Buffer(encodedPubkey, 'hex') 
     .toString('base64'); 

    let pem = `-----BEGIN RSA PUBLIC KEY-----\n`; 
    pem += `${der.match(/.{1,64}/g).join('\n')}`; 
    pem += `\n-----END RSA PUBLIC KEY-----\n`; 

    return pem; 
    }; 

전술 jsonwebtoken 라이브러리 사용 JWT 확인할 수 - 중 하지만 왜? 두 검증 방법 모두 JWT 서명의 유효성을 검증 할 수 있다면 왜 둘 다 존재합니까? 둘 사이의 상반 관계는 무엇입니까? 하나가 다른 것보다 안전합니까? 무엇을 가장 완벽하게 검증해야합니까?

+0

서명 확인에는 공개 키 (구성된) 만 사용됩니다. 두 라이브러리 모두에서 두 라이브러리는 해시를 계산하고 해시 서명의 유효성을 검사해야합니다. 유효성 검사가 제대로 수행 될 때까지 다른 사람보다 더 안전 할 이유가 없습니다. – gusto2

+0

@ gusto2 - 나는 아직도 혼란 스럽다. https://jwt.io/의 대화식 디버거가 왜 위에서 설명한 공용 메서드와 공개 메서드를 사용하여 JWT 서명 유효성 검사를 할 수 있습니까? – TheFastCat

+0

개인 키로 디지털 서명을 확인할 수 없습니다. 네가 묻고있는 것이 불분명하다. – EJP

답변

1

RSA 비대칭 키 쌍을 사용하여 JWT는 개인 키로 서명되고 공개 된 것으로 확인됩니다.

Modulus와 지수는 공개 키의 구성 요소이며 공개 키를 공개 키 (modulus)의 base64 표현 인 PEM 형식으로 작성하는 데 사용할 수 있습니다 및 지수)를 DER 2 진 형식으로 인코딩합니다. 동일한 정보를 포함하고 있기 때문에 PEM, DER 또는 모듈러스 및 지수를 사용할 수 있습니다.

그러나 누구나 모듈러스 및 지수로 개인 키를 작성할 수 없습니다. 아무도 당신을 위해 서명 할 수 없도록 비공개로 유지해야하는 비공개 RSA 요소가 필요합니다.

+0

페드로. OpenId 플로우의 관점에서 jwk/s의 모든 다른 필드가 이것과 관련되는 방법에 대한 정보에 대한 링크가 있습니까? 즉 x50c의 출처. 나는 지식과 이해를 넓히고 싶습니다. – TheFastCat

+1

OpenIdConnect 또는 Oauth2는 JWK (JsonWebKey)와 관련이 없습니다. JWK는이 RFC https://tools.ietf.org/html/rfc7517에 정의 된 암호화 키를 나타내는 형식입니다. [JKWS] (https://auth0.com/docs/jwks)는 Auth0의 개념입니다. JWK 집합을 나타내는 JSON 개체입니다. 'x5c' 속성은 public key를 포함하는 X509Certificate입니다. – pedrofb