CertOpenSystemStore()에 대한 IUSR에 대한 권한

CertOpenSystemStore()에 대한 IUSR에 대한 권한

내 CGI 응용 프로그램이 SSPI Schannel을 사용하여 다른 서버와의 TLS 연결을 생성하려고 합니다. http://www.coastrd.com/c-schannel-smtp

핸드셰이크 프로세스는 "MY" 인증서 저장소에서 인증서를 확인하는 것으로 시작됩니다. http://msdn.microsoft.com/en-us/library/aa376560(VS.85).aspx

이 함수는 0을 반환하고 GetLastError도 0을 반환합니다!? 나는 이것이 권한 문제라고 가정합니다. 예를 들어 IUSR을 관리자로 높이지 않고 이 작업을 수행하려면 어떻게 해야 합니까?

추가됨

사용자 인증서에 액세스하려면 특정 사용자로 실행해야 하며, 사용자 개인 키에 액세스하려면 사용자가 비밀번호를 사용하여 로컬로 로그온했거나 서버가 위임을 위해 활성화되어 있어야 합니다.

시스템 인증서는 누구나 읽을 수 있지만 ACL을 조정하지 않는 한 개인 키에 액세스하려면 관리자 권한(또는 로컬 사용자)이 필요합니다.

추가됨

이 상황에서는 인증서에 대한 제한이 없지만 "MY" 인증서 저장소가 비어 있고 단지 이를 위해 인증서를 구매하고 싶지 않습니다.

현재 WS2003을 사용하고 있습니다. 제가 연결하려는 서버는 TLS를 사용하여 이메일을 보내기 위해 gmail.com입니다. 내 코드로 인증서를 찾을 수 있지만 인증서가 없습니다. 내가 읽은 내용에 따르면 등록, 구매, 설치와 함께 인증서를 얻는 것이 큰 골칫거리인 것 같습니다. 그렇지 않으면 아무 도움도 되지 않는 임시 솔루션을 얻게 됩니다. 인증서를 얻는 쉬운 방법을 알지 못한다면 이는 CGI 앱에서 이메일을 보내기 위해 가고 싶은 것보다 훨씬 더 문제입니다. 다른 방법이 있나요?

Joe에게 도움을 주신 데 대해 매우 감사드립니다. 하지만 $30/yr x nServers는 선택 사항이 아닙니다. 서비스처럼 관리자 권한으로 실행되는 다른 프로세스에 작업을 넘겨줄 수 있는 방법이 있는지 궁금합니다. 특정 폴더에서 읽고 거기에 있는 이메일을 보내도록 예약된 애플리케이션을 만들 수도 있습니다. 그 외에는 CGI 응용 프로그램을 관리자로 올려야 합니다.

추가됨

Goyuix 님, 제안해 주셔서 감사합니다. 문제는 수반되는 문제가 있는 .NET(60MB) 또는 ASP와 같은 다른 라이브러리에 의존하지 않고 독립형 솔루션을 제공하는 것입니다.

맞습니다. 서버 인증만 필요합니다. 한쪽만 인증이 가능한지 몰랐습니다. 귀하의 진술: "클라이언트 인증서가 없다고 해서 SMTP에 대한 보안 채널을 설정하는 것이 중단되어서는 안 됩니다. 핸드셰이크의 해당 부분을 코딩해야 할 수도 있습니다." 해결책으로 밝혀졌습니다.

이것은 나에게 오래된 배관공 농담을 생각나게 한다. 배관공은 배수구를 뚫기 위해 호출됩니다. 그는 한 번 살펴보고 망치를 꺼내 파이프를 한 번 친다. 그는 항목별로 5분 작업에 대해 180달러, 콜아웃 요금 30달러, 파이프를 칠 위치를 아는 데 150달러를 요구합니다.

둘 다 감사합니다. 이것은 긴 오르막길이었습니다.

답변1

schannel 코드가 "MY" 저장소를 열려고 시도하는 유일한 이유는 초기 핸드셰이크의 일부로 클라이언트 인증에 사용할 수 있는 잠재적 인증서를 찾는 것입니다. 귀하의 예에서는 서버 인증에만 관심이 있다고 생각합니다(예: 클라이언트가 서버라고 생각하는 서버와 통신하는지 확인). 클라이언트 인증서가 없어도 SMTP용 보안 채널 설정이 중단되지 않습니다. 핸드셰이크의 해당 부분을 중심으로 코딩해야 할 수도 있습니다.

클라이언트 인증도 필요한 경우 다음 중 하나를 수행해야 할 수 있습니다.

  • IUSR 계정을 승격하고 머신 저장소에 인증서를 설치합니다.
  • 다른 사용자로 실행되도록 APP 풀을 변경하고 이에 맞서 싸우십시오.

링크된 코드를 수정하는 것에 관해서는... 음 - 옵션인 경우 .NET 프레임워크와 함께 제공되는 SmtpClient 코드를 시도해 보는 것이 좋습니다. 암호화된 통신을 지원하며 이론적으로 "작동"해야 합니다. 관리되는 C++도 옵션인가요? 아니면 이를 위해 ASP.NET 처리기를 작성하는 것이 더 낫습니까?

http://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient_members.aspx

다음 페이지에서 관련 코드 질문을 해볼 수도 있습니다.StackOverflow.com, 그곳에 있는 사람들도 도움을 줄 수 있을 것입니다.

답변2

최선의 선택참조는 시스템 인증서를 사용하고 IUSR 계정에 인증서의 개인 키를 읽을 수 있는 권한을 부여하는 것입니다. 이는 수동 단계이지만 한 번만 수행하면 되는 매우 쉬운 단계입니다.

귀하의 상황에 인증서 권한 변경을 방지하는 다른 요구 사항이 있습니까?


시작하는 방법

먼저 인증서가 필요합니다. 직접 생성할 수도 있지만 사용 방법과 이를 검증하는 상대방에 따라 구입해야 할 수도 있습니다. 인증서를 생성하는 방법은 다루지 않겠습니다. 이전에 인증서 및 인증 기관과 협력한 적이 없다면 먼저 이에 대해 알아보는 것이 좋습니다.

달리 언급하지 않는 한 Windows Server 2003을 사용하고 있다고 가정하겠습니다.

1) 인증서를 머신 저장소에 설치합니다. 시작으로 이동 | MMC를 실행하고 입력하면 빈 MMC 콘솔이 생성됩니다. 파일로 이동 | 스냅인 추가/제거. 추가 버튼을 클릭하여 스냅인을 선택합니다. 목록에서 인증서를 선택하고 추가를 클릭합니다. 컴퓨터 계정 옵션을 선택한 다음 다음, 마침, 닫기를 선택한 다음 마지막으로 확인을 선택합니다.

2) 인증서를 Machine Store로 가져옵니다. 트리를 확장하고 개인 폴더를 선택합니다. 개인을 마우스 오른쪽 버튼으로 클릭하고 모든 작업, 가져오기를 선택합니다. 마법사를 따라 프로세스를 완료하세요. 이제 인증서가 컴퓨터 저장소에 있어야 합니다.

3) 개인 키 권한을 조정합니다. Windows 2008에서는 인증서 관리자 GUI에 추가됩니다. Windows 2003에서는 다음을 다운로드해야 합니다.Windows Server 2003 리소스 키트 도구. 권한을 설정하려면 다음 명령 형식을 사용하십시오.

C:\Program Files\Windows Resource Kits\Tools\winhttpcertcfg.exe -g -c LOCAL_MACHINE\My -s "mycert" -a "USER_ACCOUNT" 

여기서 'LOCAL_MACHINE\My'는 로컬 컴퓨터의 개인 인증서 저장소이고 'mycert'는 인증서 이름이며 USER_ACCOUNT는 개인 키에 대한 읽기 권한이 부여되는 계정입니다. IUSR 계정을 사용해 볼 수 있지만 CGI 앱이 실행되는 정확한 컨텍스트에 따라 'NETWORK SERVICE'를 사용해야 할 수도 있습니다. 변경 사항을 적용하려면 IIS를 다시 시작해야 합니다. 그만큼WinHttpCertCfg에 대한 설명서그것이 무엇을 하고 있는지 다룹니다.

이제 개인 키에 액세스할 수 있는 권한이 있어야 합니다. MY 플래그와 함께 CertOpenSystemStore를 계속 사용하게 됩니다.

도움이 되길 바랍니다.


편집 2:

인정된 기관의 인증서를 쉽게 받을 수 있는 곳은 GoDaddy입니다. $30에 1년 동안 유효한 SSL 인증서를 받을 수 있습니다. 좀 더 찾아보시면 더 저렴한 곳도 있을 겁니다. 그렇게하는 것은 그리 어렵지 않습니다. 대부분의 사이트는 매우 사용자 친화적이며 인증서를 쉽게 구입할 수 있습니다.

상호 인증을 수행하고 있으므로 유효한 권한이 있는 인증서가 필요하며 Gmail 서버에서는 이를 확인할 방법이 없기 때문에 직접 만들 수 있는 자체 서명 인증서가 필요합니다.

관련 정보