오픈ID 보안:RP는 실제 공급자가 인증을 승인했는지 확인하지 않습니다.
-
11-12-2019 - |
문제
일반적인 설명
다음을 사용하여 OP(OpenID 공급자)를 구현했습니다. DotNetOpenAuth.Drupal의 OpenID 로그인 및 OpenIdRelyingPartyWebForms
DotNetOpenAuth의 프로젝트 Samples
해결책.
문제는 내가 아는 한, 브라우저가 내 OP에 대해 반송되고 "성공적인 인증" 요청을 보낼 때(mode: id_res
, claimed_id: smth
, 등) RP로 돌아가면 RP는 OP에 대한 서버측 요청을 수행하려고 시도하지 않고 실제로 사용자를 인증했는지 묻지 않습니다.나는 거기에 있다는 것을 알 수 있다 openid.sig
OP에서 서명이 반환되었지만 OP와 키를 교환하지 않았기 때문에 RP가 서명을 어떻게 확인할 수 있는지 알 수 없습니다.
질문은 다음과 같습니다. 작업 흐름을 안전하게 만들기 위해 활성화할 수 있는 OP 측 설정이 있습니까?
기술적 세부 사항
저는 Wireshark를 사용하여 RP 측에서 HTTP 트래픽을 스니핑하고 있습니다.HTTPS가 없으므로 모든 메시지를 보고 읽을 수 있습니다.아래에서 정확히 무슨 일이 일어나는지 볼 수 있습니다. 비 = 브라우저, OP = OpenID 제공업체, RP =신뢰당사자.도메인 이름은 *.example.com으로 대체됩니다.
(B –> RP) 사용자가 신뢰 당사자의 구성원 전용 리소스를 방문하려고 합니다.그는 브라우저가 RP에 게시하는 OP 엔드포인트를 입력합니다.
openid_identifier: http://OP.example.com/OpenId/Provider.aspx?xrds
(RP –> OP –> RP) RP는 XRDS 문서를 반환하는 내 OP에 서버 측 요청을 발행합니다.여기서는 비밀 키 교환과 유사한 것을 볼 수 없습니다.
<?xml version="1.0" encoding="UTF-8"?> <xrds:XRDS xmlns:xrds="xri://$xrds" xmlns:openid="http://openid.net/xmlns/1.0" xmlns="xri://$xrd*($v*2.0)"> <XRD> <Service priority="10"> <Type>http://specs.openid.net/auth/2.0/server</Type> <Type>http://openid.net/extensions/sreg/1.1</Type> <URI>http://OP.example.com/OpenId/Provider.aspx</URI> </Service> </XRD> </xrds:XRDS>
(RP –> B –> OP) 신뢰 당사자 302 - 사용자를 OP로 리디렉션합니다.
/OpenId/Provider.aspx?[params]
매개변수가 다음과 같은 URL:openid.claimed_id: http://specs.openid.net/auth/2.0/identifier_select openid.identity: http://specs.openid.net/auth/2.0/identifier_select openid.assoc_handle: {634730422000625000}{jkQC1Q==}{32} openid.return_to: http://RP.example.com/login.aspx?ReturnUrl=%2FMembersOnly%2FDefault.aspx&dnoa.receiver=ctl00_Main_OpenIdLogin1&dnoa.UsePersistentCookie=Session&dnoa.userSuppliedIdentifier=http%3A%2F%2FOP.example.com%2FOpenId%2FProvider.aspx%3Fxrds openid.realm: http://RP.example.com/ openid.mode: checkid_setup openid.ns: http://specs.openid.net/auth/2.0 openid.ns.sreg: http://openid.net/extensions/sreg/1.1 openid.sreg.policy_url: http://RP.example.com/PrivacyPolicy.aspx openid.sreg.required: email,gender,postcode,timezone
(OP –> B –> RP) 공급자는 사용자를 인증하고 다음 URL 매개변수를 사용하여 사용자를 다시 RP로 302 리디렉션합니다.
ReturnUrl: /MembersOnly/Default.aspx dnoa.receiver: ctl00_Main_OpenIdLogin1 dnoa.UsePersistentCookie: Session dnoa.userSuppliedIdentifier: http://OP.example.com/OpenId/Provider.aspx?xrds openid.claimed_id: http://OP.example.com/OpenId/User.aspx/2925 openid.identity: http://OP.example.com/OpenId/User.aspx/2925 openid.sig: pWJ0ugjQATKGgRSW740bml9LDsSxFiJ+a9OLO6NlsvY= openid.signed: claimed_id,identity,assoc_handle,op_endpoint,return_to,response_nonce,ns.sreg,sreg.nickname,sreg.email openid.assoc_handle: {634730422000625000}{jkQC1Q==}{32} openid.op_endpoint: http://OP.example.com/OpenId/Provider.aspx openid.return_to: http://RP.example.com/login.aspx?ReturnUrl=%2FMembersOnly%2FDefault.aspx&dnoa.receiver=ctl00_Main_OpenIdLogin1&dnoa.UsePersistentCookie=Session&dnoa.userSuppliedIdentifier=http%3A%2F%2FOP.example.com%2FOpenId%2FProvider.aspx%3Fxrds openid.response_nonce: 2012-05-19T16:40:11ZSfsL4BK1 openid.mode: id_res openid.ns: http://specs.openid.net/auth/2.0 openid.ns.sreg: http://openid.net/extensions/sreg/1.1 openid.sreg.nickname: user@OP.example.com openid.sreg.email: user@OP.example.com
(RP –> OP) RP는 OP에 대한 서버측 HTTP 요청을 수행합니다.데이터는 전송되지 않으며 이전에 획득한 사용자 ID URL에 대한 GET 요청만 있습니다.그런데 왜 이런 요청을 하는 걸까요?
GET /OpenId/User.aspx/2925 HTTP/1.1
(OP –> RP) OP는 다른 XRDS 문서로 응답합니다.
<xrds:XRDS xmlns:xrds="xri://$xrds" xmlns:openid="http://openid.net/xmlns/1.0" xmlns="xri://$xrd*($v*2.0)"> <XRD> <Service priority="10"> <Type>http://specs.openid.net/auth/2.0/signon</Type> <Type>http://openid.net/extensions/sreg/1.1</Type> <URI>http://OP.example.com/OpenId/Provider.aspx</URI> </Service> <Service priority="20"> <Type>http://openid.net/signon/1.0</Type> <Type>http://openid.net/extensions/sreg/1.1</Type> <URI>http://OP.example.com/OpenId/Provider.aspx</URI> </Service> </XRD> </xrds:XRDS>
(RP –> B) 그게 다야.사용자에게 권한이 부여되고 RP는 그에게 회원 전용 리소스를 보여줍니다.
해결책
RP는 다음에서 작동할 수 있습니다. 상태 저장 또는 무국적 모드(각각 스마트 모드와 멍청 모드라고도 함)확인해 보세요 각 네트워크 흐름도.
RP가 상태 저장 모드에서 작동하는 경우 RP와 OP 간에 일회성 키 교환이 있습니다.상태 비저장 모드에서는 각 인증 후 어설션의 서명을 확인하기 위해 RP에서 OP로 보내는 메시지가 표시됩니다.
#5(청구된 식별자에 대한 HTTP HEAD 요청)에 대한 질문과 관련하여 이는 OP가 주장하는 ID에 대해 권한이 있는지 확인하는 DotNetOpenAuth RP입니다.이전에 이 URL을 가져왔으므로 캐시가 시작되어 콘텐츠 전송을 방지합니다.
다른 팁
지금은 바보 같은 기분이 들어요. 기본적인 걸 놓쳤어요. ~이다 RP와 OP 간의 키 교환은 단 한 번만 발생하고 키는 한동안 양쪽에 캐시됩니다.
따라서 OpenID 공급자 구현은 안전한 것으로 나타났습니다. :)