我在Windows 7和Windows Embedded CE6.0(ARMV4I平台)上使用OpenSSL。
为此,我自己编译了OpenSSL,最初用于Windows 7和我的ARMV4I平台的0.9.8w版本。执行openssl.exe
可以在两台机器上正常工作。
我编译mkcert.c,它使用我之前构建的libeay32.dll
。
在我的Windows 7机器上,一切正常,证书正确发出。但是在ARMV4I设备上,我注意到日期(X509_get_notBefore(x)
和X509_get_notAfter(x)
)是错误的:
X509_get_notBefore(x)
值为150710093249Z
X509_get_notBefore(x)
值39150810093249Z
差异始终是值39000100000000
。这导致Windows CE的有效性不同,现在是Aug 10 09:32:49 3915 GMT
而不是Jul 10 09:32:49 2015 GMT
。
后来我编译了OpenSSL 1.0.2c并执行了相同的代码,但问题仍然存在。
你知道为什么会发生这种情况以及如何解决这个问题吗?
(一种可能的解决方法可能是手动调整Windows CE上的ASN1_TIME:
#ifdef UNDER_CE
X509_gmtime_adj(notBefore,-39000100000000);
X509_gmtime_adj(notAfter,-39000100000000);
#endif
这需要在各个步骤中进行,因为X509_gmtime_adj()
只接受long类型的第二个参数:
ASN1_TIME *X509_gmtime_adj(ASN1_TIME *s, long adj);
我使用Microsoft Visual Studio 2008版本3.5 SP1。