2016-07-26 6 views
3

Ich habe ein Zertifikat zu überprüfen und sicherzustellen, wird mit dem folgenden Code nicht abgelaufen:C# GetExpirationDateString() Daten in kurzer Datumsformat Rückkehr Ausgabe Erstellung

if (DateTime.Parse(cert.GetExpirationDateString()) <= DateTime.Now) 
{ 
    _logger.Log(LogLevel.Error, "Chain Certificate is Expired"); 
    return false; 
} 

cert eine Instanz von X509Certificate Klasse von .net ist.

Problem, das mit Blick auf bin, ist GetExpirationDateString Funktion das Datum des Ablaufs im String-Format

(die auf dem kurzen Datumsformat der aktuellen Kultur abhängt) gibt Wenn das kurze Datumsformat meiner Maschine DD-MM-YY ist es Verfallsdatum zurückgibt 21-12-2030 als 21-12-30, DateTime.Parse Funktion konvertiert 30 zu 1930 (wenn das Ablaufjahr> 30 ist).

Gibt es einen Weg, mit dem ich das Zertifikat Ablauf immer in dd/mm/yyyy Format erhalten kann, um dieses Problem zu vermeiden?

+1

Kann Sie wechseln zu 'x509Certificate2'? Dann können Sie die "NotAfter" -Eigenschaft verwenden, die eine richtige 'DateTime' ist. –

+0

MS Eigentlich empfehlen, x509Certificate2 zu verwenden. : _ASN.1 DER ist das einzige von dieser Klasse unterstützte Zertifikatformat. Für die meisten Szenarien sollten Sie stattdessen die X509Certificate2-Klasse verwenden. _ –

+0

Dank Glorin, Rich Ich verwendete NotAfter-Eigenschaft der X509certificate2-Klasse und es sortierte meine Ausgabe –

Antwort

4

Die Zeichenfolge Darstellung Jahr 30 wird immer standardmäßig auf 1930 und nie auf 2030 bei der Analyse einer DateTime konvertiert werden, egal wie Sie es versuchen. Ihre beste Wette ist zu tun, wie @Glorin vorgeschlagen und X509Certificate2 verwenden. Dieser Typ hat einen Konstruktor, der eine Instanz X509Certificate übernimmt. Alternativ können Sie mit einem der anderen Konstruktoren generieren. Hier ist ein Beispielcode auf, was Sie zur Verfügung gestellt:

var cert2 = new X509Certificate2(cert); 
if(cert2.NotAfter <= DateTime.Now) 
{ 
    _logger.Log(LogLevel.Error, "Chain Certificate is Expired"); 
    return false; 
} 
+0

Danke Igor, die mein Problem aussortieren –

1

Sie können versuchen, diese (weil ich in französisch Sprache bin das Format für Sie ist vielleicht MM/dd/yyyy):

DateTime dt = DateTime.ParseExact(item.GetExpirationDateString(), "dd/MM/yyyy hh:mm:ss", CultureInfo.InvariantCulture); 
string s = dt.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture); 
Console.WriteLine(s);