ASP.NET Konfigurationsdatei verschlüsseln

Manchmal ist es notwendig, auch sensible Daten in der Konfigurationsdatei einer ASP.NET Webanwendung zu hinterlegen. Ein klassisches Beispiel dafür ist zum Beispiel das Passwort für eine Datenbankverbindung.

Nun möchte ich diese Informationen nicht gerade als normalen Text ablegen, sondern gerne verschlüsselt speichern. .NET ermöglicht dies schon seit längerem mit dem, im Framework mitgelieferten Tool aspnet_regiis.exe

Das Verschlüsseln ist dabei, die richtigen Berechtigungen vorausgesetzt, für die Applikation transparent. Das bedeutet, dass die Entschlüsselung direkt von .NET vorgenommen wird, und es keiner zusätzlichen Modifikation der vorhandenen Applikation bedarf.

Wie das Verschlüsseln mit aspnet_regiis funktioniert, und wie die zum Teil verschlüsselte Konfigurationsdatei auch auf anderen Systemen gelesen werden kann, werde ich in diesem Artikel beschreiben.

Sehen wir uns zunächst einmal den Bereich der Konfigurationsdatei an, in dem die Informationen für die Datenbankverbindung gespeichert wird.

Alle Angaben innerhalb von <connectionStrings> </connectionStrings> will ich nun mit aspnet_regiis.exe verschlüsseln. Dazu muss ich zuerst herausfinden, wo das Programm auf meinem System gespeichert ist.

Die verschiedenen Versionen des .NET Frameworks werden normalerweise in folgendem Verzeichnis installiert.

%WINDIR%\Microsoft.NET\Framework

In meinem Fall befindet sich die aktuellste Version im Unterverzeichnis v4.0.30319, in welchem sich auch die gesuchte aspnet_regiis.exe befindet.

Damit ich beim zukünftigen Ausführen von aspnet_regiis nicht immer den langen Pfad mit angeben muss, setzte ich mit einfach eine Umgebungsvariable mit dem Namen FrameworkDir.

SET FrameworkDir=%WINDIR%\Microsoft.NET\Framework\v4.0.30319

Nun kann ich die Exe von jedem beliebigen Verzeichnis aus wie folgt aufrufen:

%FrameworkDir%\aspnet_regiis.exe

Als nächstes erzeuge ich mir nun einen RSA Key Container, dessen Schlüssel ich dann später zum Verschlüsseln verwenden werde. Das Schlüsselpaar lässt sich auch als XML-Datei exportieren und auf einem anderem System wieder importieren. Dadurch ist es möglich die gleiche verschlüsselte Konfiguration auch auf andere Systemen zu nutzen.

Erzeugt wird ein Container mit dem Parameter -pc gefolgt vom Namen. Da ich das Schlüsselpaar später exportieren möchte, verwende ich zusätzlich noch den Parameter -exp

Der Befehl zum Erstellen lautet dann:

aspnet_regiis.exe -pc "MyContainer" -exp

Um die Schlüssel im XML-Format zu exportieren wird folgendes Kommando ausgeführt.

aspnet_regiis -px "MyContainer" .\MyContainerKeys.xml -pri

Mit -px wird der Name des zu exportierenden Containers angegeben, gefolgt vom XML-Dateinamen. -pri sorgt dafür, dass auch der private Schlüssel des Schlüsselpaares exportiert wird.

Da die exportierte Datei auch den privaten Schlüssel enthält, empfiehlt es sich, die exportierte Datei an einem sicheren Ort aufzubewahren.

Falls gewünscht können die Schlüssel nun, mit folgendem Befehl, auch auf anderen Systemen importiert werden.

aspnet_regiis -pi "MyContainer" .\MyContainerKeys.xml

Nach dem Import ist es wichtig, die Datei wieder zu löschen und allen Accounts/Benutzern, die Zugriff auf den neuen Key-Container benötigen, die notwendigen Rechte einzuräumen. Im Falle einer Web-Applikation kann das zum Beispiel die Identität eines IIS Application Pools sein.

Um der Identität des Default Application Pools dann Zugriff auf den Key-Container zu geben, wird folgender Befehl verwendet:

aspnet_regiis -pa "MyContainer" "IIS AppPool\DefaultAppPool"

Nun kann ich fast mit der eigentlichen Verschlüsselung beginnen. Damit das aber funktioniert, müssen in der Konfigurationsdatei zunächst noch Angaben zum verwendeten Verschlüsselungsprovider und dem zu verwendenden Key-Container hinzugefügt werden. Dies sieht dann so aus:

 <configProtectedData>
    <providers>
      <add name="RSAProvider"
           type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
           keyContainerName="MyContainer"
           useMachineContainer="true" />
    </providers>
  </configProtectedData>

Jetzt ist es endlich soweit. Nachdem ich in der Kommandozeile in das Verzeichnis der zu verschlüsselnden web.config Datei gewechselt haben, kann ich die Verbindungsinformationen verschlüsseln. Dazu verwende ich folgenden Befehl:

aspnet_regiis -pef "connectionStrings" . -prov "RSAProvider"

Der Parameter -pef wird verwendet, um die zu verschlüsselnde Sektion anzugeben. “.” spezifiziert den Ordner in dem sich die web.config Datei befindet. In diesem Fall also das momentane Verzeichnis. Mit dem letzten Parameter -prov wird dann noch der Name des zu verwendenden Verschlüsselungsproviders übergeben.

Wie auf dem unteren Bild zu erkennen, wurden die Daten erfolgreich verschlüsselt

Müssen die Konfigurationsdaten eventuell geändert werden, so lässt sich die Verschlüsselung jederzeit wieder mit folgendem Kommando rückgängig machen:

aspnet_regiis -pdf "connectionStrings" . -prov "RSAProvider"

Unglücklicherweise funktioniert die Verschlüsselung einer app.config mit aspnet_regiis nicht direkt. Benennt man die app.config aber in web.config um, verschlüsselt und macht die Änderung des Namens danach wieder rückgängig, so lässt sich auch das bewerkstelligen.

Scroll to top