Archiv

Archiv für März, 2010

SSL-Zertifikat auf 1&1 Windows Webserver installieren

22. März 2010 2 Kommentare

Bei der Installation eines SSL-Zertifikat’s auf einem Windows Webserver 2008 x64 von 1&1 bin ich auf einige Probleme gestoßen. Deren Umschiffung möchte ich hier zeigen.

Nach Beantragung des Zertifikates erhält man eine Email mit einiger Hilfestellung. Zuerst wird man auf die Hilfe-Seite von GeoTrust verwiesen. Leider passt die Anleitung nicht, da man beim Versuch, im IIS7 ein “Complete Certificate Request” durchzuführen, nur eine Fehlermeldung erntet:

CertEnroll::CX509Enrollment::p_InstallResponse: ASN1 bad tag value met. 
0x8009310b (ASN: 267)

Das 1&1 Hilfe-Center bringt einen da schon weiter. Man muss nur eine pfx-Datei aus seinem Zertifikat im Control-Center erstellen und dieses im IIS importieren.

Leider gibt es dann aber immer noch Probleme, will man das Zertifikat einer Webseite zuzuordnen:

A specified logon session does not exist. It may already have been terminated. 
(Exception from HRESULT: 0x80070520)

Eine Lösung fand ich in einem IIS-Forum und in einem Blog. Man exportiert das Zertifikat im IIS und importiert es anschließen erneut. Dann lässt sich im IIS problemlos die neue Bindung anlegen.

KategorienAllgemein Tags: , ,

RSA Signierung von Strings

19. März 2010 Keine Kommentare

Im Rahmen eines Projektes wollte ich ursprünglich Strings mittels eines asymmetrischen Verschlüsselungsverfahrens verschlüsseln. Hierzu wählte ich als Verfahren RSA. Nachdem ich alles soweit fertig hatte, ist mir leider aufgefallen, dass RSA mittels des privaten Schlüssels nur entschlüsseln kann, nicht jedoch verschlüsseln. Um trotzdem Nutzen aus der Sache zu ziehen (es ging nur um Prüfung von Daten), nutze ich den privaten Schlüssel nun zur Erzeugung einer Datensignatur. Die Anwendung des Anwenders kann diese mittels des öffentlichen Keys problemlos überprüfen.

Da es recht aufwendig ist, die geeigneten konkreten Klassen und Funktionen zur Erzeugung und Speichern der Schlüssel sowie zur Anwendung der Signierung herauszusuchen, habe ich eine kleine Demo-Anwendung geschrieben. Die jeweils benötigten Eingabefelder wurden farbig passend hervorgehoben.

Benötigt wird zuerst der passende Namespace:

using System.Security.Cryptography;

Die Erzeugung der Schlüssel ist extrem einfach:

            var rsa = new RSACryptoServiceProvider();
            textBoxPrivateKey.Text = rsa.ToXmlString(true);
            textBoxPublicKey.Text = rsa.ToXmlString(false);

Die ToXmlString-Funktion erzeugt ein sehr gut speicherbares Format der Schlüssel, dass so auch wieder gut eingelesen werden kann. Wichtig ist aber, die Signatur in ein übertragungstaugliches Format zu bringen, da diese standardmäßig aus Bytes besteht. Hierzu nutze ich eine Hilfsfunktion BytesToHex:

        public static string BytesToHex(byte[] bytes)
        {
            var hexString = new StringBuilder(bytes.Length);
            for (int i = 0; i < bytes.Length; i++)
            {
                hexString.Append(bytes[i].ToString("X2"));
            }
            return hexString.ToString();
        }
 
        private void ButtonSignTextClick(object sender, EventArgs e)
        {
            var rsa = new RSACryptoServiceProvider();
            rsa.FromXmlString(textBoxPrivateKey.Text);
 
            var encryptedSymmetricKey = rsa.SignData(
                Encoding.Unicode.GetBytes(textBoxSourceText.Text), 
                new SHA1CryptoServiceProvider());
            textBoxSignature.Text = BytesToHex(encryptedSymmetricKey);
        }

Ist die Signatur erstellt, kann sie auf ähnliches Weg überprüft werden.

        public static byte[] StringToByteArray(String hex)
        {
            int numberChars = hex.Length;
            var bytes = new byte[numberChars / 2];
            for (int i = 0; i < numberChars; i += 2)
                bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
            return bytes;
        }
 
        private void ButtonTestSignClick(object sender, EventArgs e)
        {
            var rsa = new RSACryptoServiceProvider();
            rsa.FromXmlString(textBoxPublicKey.Text);
 
            byte[] signText = StringToByteArray(textBoxSignature.Text);
            byte[] originalText = Encoding.Unicode.GetBytes(textBoxSourceText.Text);
 
            bool signOk = rsa.VerifyData(originalText, new SHA1CryptoServiceProvider(), signText);
 
            MessageBox.Show("Signature OK: " + signOk);
        }

Hier kann das ganze noch als VS2008-Anwendung mit einer ausführbaren Datei zusammen heruntergeladen werden: RSA Source

KategorienMicrosoft .NET Tags: , ,