2008-12-11 3 views
0

ASP.NET 보호 설정을 사용하는 경우 공개 키를 사용하여 구성을 어떻게 암호화 할 수 있습니까?ASP.NET 보호 설정 - 공개 키로 암호화하는 방법?

공개 키 파일을 내보낼 수 있습니다. 그런 다음 공개 키를 사용하여 나중에 배포 할 수 있도록 다른 서버의 구성 파일을 암호화하고 싶습니다. 그러나 aspnet_regiis가 내 보낸 공개 키를 사용하는 방법을 알아낼 수 없습니다.

기본적으로 공개 키를 컨테이너로 가져 와서 암호화했습니다. 그러나 기존 키를 사용하여 암호화하는 대신 기존의 공개 키를 덮어 쓰는 완전히 새로운 키 쌍을 만듭니다. 아래의 스크립트에서 각 복사 된 파일의 이름을 connections.config로 다시 변경하고 해독하려고하면 두 번째 (connectionstring_build.encrypted)가 성공하는 반면 첫 번째 (connectionstring_server.encrypted)는 실패하고 새 키 쌍이 만들어졌습니다. (이는 경우 aspnet_regiis 기능을 테스트하기 위해 단지 예입니다 그것의 나의 실제 사용은, 분명히, 약간 다른 것 편집.) : 여기

내가 시도 접근 방식을 보여줍니다 배치 파일이

REM delete container in case it already exists 
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pz "MyKeys" 

REM create container 
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pc "MyKeys" 

REM export key 
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -px "MyKeys" "publicKey.xml" 

REM encrypt file 
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pef "connectionStrings" . -prov "MyProvider" 

REM copy encrypted file for later comparison 
copy connections.config connectionstring_server.encrypted 
pause 

REM decrypt file 
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pdf "connectionStrings" . 

REM delete continer 
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pz "MyKeys" 

REM import public key 
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pi "MyKeys" publicKey.xml 

REM encrypt file with just public key - THIS DOES NOT WORK CORRECTLY, it creates a new keypair 
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pef "connectionStrings" . -prov "MyProvider" 

REM copy back encrypted file 
copy connections.config connectionstring_build.encrypted 
pause 

REM decrypt file 
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pdf "connectionStrings" . 

<connectionStrings> 
    <add name="SomConnectionName" connectionString="Data Source=somedatasource; Initial Catalog=somedatabase; Integrated Security=SSPI; Persist Security Info=False;" providerName="System.Data.SqlClient" /> 
</connectionStrings> 
:

그리고 여기 샘플 web.config를

<?xml version="1.0"?> 
<configuration> 
    <configProtectedData> 
     <providers> 
      <add name="MyProvider" keyContainerName="MyKeys" type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" useMachineContainer="true" /> 
     </providers> 
    </configProtectedData> 
    <connectionStrings configSource="connections.config" /> 
</configuration> 

그리고 해당 connections.config입니다

편집 : 다음과 같이 개인 키를 내보낼 수도 있습니다. 실제로 암호화가 작동 할 수는 있지만 개인 키를 암호화 할 필요는 없습니다. 내가 원하는 것은 설정 파일을 사용할 서버에 개인 키를 남겨두고 공개 키를보다 접근하기 쉬운 장소에 저장하는 것입니다. 이렇게 간단히 aspnet_regiis의 제한을 할 수없는 것입니까?

답변

1

수출 명령에 문제가 있다고 생각합니다. 내보낼 때 aspnet_regiis에 공개 키와 개인 키를 내보내려는 경우 -pri 인수를 지정해야합니다.

REM export key 
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -px "MyKeys" "publicKey.xml" -pri 

개인 키가 없으면 가져 오기가 여전히 자체 키 쌍을 만듭니다. 이 버그는 Microsoft 버그 일 수 있습니다. aspnet_regiis는 불완전한 키를 가져올 수 없다는 경고와 함께 대신 새로운 키를 가져 왔음을 경고해야합니다.

공개 키만 내보내면 유용 할 수 있습니다. 작업 또는 개발 그룹에 xml 파일을 제공하고 개인 키를 누설하지 않고도 서버에 배포되기 전에 구성 파일을 암호화 할 수 있습니다. 또한 팜의 각 서버에서 암호화 프로세스를 실행할 필요가 없습니다.

0

버그인지 아닌지는 잘 모르겠지만이 문제도 확실히 해결되었습니다. .net 함수가 작동하려면 공개 키와 개인 키를 Windows 키 저장소로 가져와야합니다. 그러나 키를 가져올 때 -exp 스위치를 지정하지 않으면 개인 키를 보호 할 수 있습니다.