2016-09-13 9 views
3

RS256 알고리즘을 사용하여 JWT에 서명하고 있습니다. 클라이언트의 토큰을 확인하기 위해 공개 키에 액세스해야합니다.JWT RS256 : https를 통해 공개 키를 가져 오는 것이 안전합니까?

공개 키를 포함하는 인증서를 반환하는 보호되지 않은 API 경로 ('/ api/certificate')를 설정할 때 보안 문제 (스푸핑, ...)가 있습니까? 추가 보안 측정을 수행해야합니까?

답변

3

몇 가지 개념이 종종 어울리지 않을 수도 있지만,이 대답에서 몇 가지를 설명하려고합니다.

분명히 공개 키와 개인 키가 필요합니다. 둘 다 기본적으로 숫자입니다. 개인 키는 비밀로 유지되며, 대중은 잘 알려져 있으며, 누구나 가질 수 있습니다. 물건에 서명 할 때 개인 키를 사용하여 서명 한 다음 공개 키를 사용하여 누구나 해당 개인 키 (즉, 귀하)가 서명 한 사람이 서명했는지 확인할 수 있습니다.

하지만 문제는 공개 키를 배포하는 방법이나 클라이언트가 어떻게 가져 오는 지에 대한 예입니다. 당신이 질문에서 정확하게 지적했듯이, 보안되지 않은 채널을 통해 공개 키를 다운로드하는 것만으로는 충분하지 않습니다. 공격자가 자신의 암호로 바꿀 수 있기 때문에 공격자가 토큰에 서명 할 수 있습니다.

제안 된대로 https를 통해 얻을 수있는 해결책 중 하나는 실질적으로 두 번째 공개 - 개인 키 쌍 (웹 서버의 키)을 사용하여 첫 번째 보안을 보내는 것을 의미합니다. 이론적 인 질문은 여전히 ​​동일하지만 실제적으로 백그라운드에서 해결됩니다. 브라우저가 연결시 서버로부터받는 공개 키가 실제로 서버에 속한다는 것을 브라우저가 어떻게 알 수 있습니까? 아직 그들 사이에는 보안 채널이 없습니다.

인증서를 입력하십시오.

인증서는 본질적으로 소유자에게 공개 키를 연결하는 문서이며 사용자가 원하는 바로 그 문서입니다. 브라우저가 웹 사이트에 연결하면 서버는과 함께 공개 키 을 전송하므로 브라우저는 공개 키가 실제로 공개 키가 전송 된 서버 (이 경우 도메인 이름)에 속하는지 확인할 수 있습니다. 그것이이 게시물의 범위를 벗어나는 지 여부를 확인하는 방법은 인증서가 다른 공개 키에 의해 서명되고, 다른 공개 키로 인증서가 서명 될 수 있으며, 체인이 목록에 의해 종료된다는 것입니다 OS/브라우저 공급 업체가 컴퓨터 및/또는 브라우저 용으로 이미 설정 한 신뢰할 수있는 루트 인증서.

또한 인증서를 사용하여 공개 키를 확인해야합니다. 이렇게하려면 SSL (https) 전송 부담이 필요하지 않습니다. 공개 키가 특정 주제에 속하는지 확인하는 것이 인증서의 주된 목적입니다.

그렇다면 API에서 공개 키를 가져 오는 것이 아니라 인증서와 함께 가져 오는 것뿐입니다. 아마 벌써 이것을하고있을 것입니다. 벌거 벗은 공개 키는 거의 사용되지 않습니다. 이미 서버에서 pfx 또는 cer 또는 crt를 수신하고 있습니다. 개발중인 기술 스택에 따라 인증서를 완벽하게 검증하고 유효성을 확인하기 위해 내장 된 메커니즘을 확실히 사용할 수 있습니다. 그래도 까다로운 사업이고 옳은 일을하기는 매우 어렵 기 때문에 자신의 유효성 검사를 구현하지 마십시오. 인증서가 유효성 검사를 통과하면 API에서받은 공개 키가 신뢰할 수 있고 속하는 것으로 주장 된 것으로 속한다고 신뢰할 수 있습니다. 예를 들어, 기본 유효성 검사를 넘어서 다른 사용자가 가질 수없는 인증서의 필드 조합을 확인해야합니다.

추가 보안 조치로 인증서 고정을 구현하여 클라이언트의 유효한 인증서에 대한 지문 목록을 사용하여 특정 유형의 공격에 대한 보안을 더욱 강화할 수 있습니다 (브라우저 클라이언트는 아니지만 여전히 개념은 동일합니다).

편집 (이 만료 일반 유효성 검사 등을 통과 한 후 인증서에 어떤 필드를 확인하기 위해) :이 인증서 및 인증서의 종류 그것이 서명 한 사람에 따라 일반적인 경우

합니다.

실제 CA (인증 기관)에서 서명 한 서버 인증서는 CN (일반 이름) 필드로만 서버 도메인을 가질 수 있으며 실제 CA는 다른 서명을하지 않으며 yourdomain.com을 관리 할 수 ​​없다면 yourdomain.com에 대한 인증서를 제출하십시오. 그러므로이 경우 인증서가 유효성 검사를 통과 한 후 CN을 확인하는 것으로 충분할 수 있습니다. CN을 확인해야 할 필요가 있습니다. GlobalSign이나 Thawte 또는 기타 신뢰할 수있는 CA로부터 유효한 인증서를 얻을 수있는 사람은 누구나 할 수 있습니다. 비용 만 지불하면됩니다. 그들이 가질 수없는 것은 yourdomain.com의 인증서입니다.

자신의 인증서에 서명하는 경우 누구에게도 아무 것도 서명하지 않으므로이 경우 서명 한 발급자와 CN을 확인하는 것으로 충분할 수 있습니다. 인증서가 그렇지 않으면 유효성 검사를 통과 한 경우 (신뢰할 수있는 루트 인증서가 서명 한 것을 의미 함) 공격자가 일반적으로 컴퓨터에서 신뢰할 수있는 CA 인증서를 가질 수 없기 때문에 인증서가 정상적으로되어야합니다.

일반적으로 다른 사람들이 가질 수없는 것을 확인하고 싶습니다. 실제 CA를 사용하는 경우 더 쉽습니다. 일반적으로 지문을 확인하는 것이 가장 좋습니다.

+0

귀하의 대답은 매우 재미 있습니다. https를 사용하여 인증서 유효성 검사를 추가하려고합니다. 당신이 말했듯이, 자신의 유효성 검사를 구현하지 않는 것이 좋으며, 인증서를 파싱하고 전체 이름 문자열을 검사하는 것이 좋습니다. –

+0

나는 대답에 대한 나의 생각을 덧붙였다. –

+0

시간과 포괄적 인 답변에 감사드립니다. 나는 그것을 받아 들일 것이다! –