我们为所有生产版本执行代码签名和时间戳。有时(通常是当我们准备进行RTM(!)时),Verisign的时间戳服务器(“ http://timestamp.verisign.com/scripts/timstamp.dll ”)决定间歇性地脱机。
在这种情况下我们该怎么办?
- 时间戳服务器是否必须由您的根证书颁发机构托管?
- 如果服务器停机,是否还有其他网络托管时间戳服务器可以代替Verisign使用?欢迎其他高可用性和免费替代方案的建议:)
我们为所有生产版本执行代码签名和时间戳。有时(通常是当我们准备进行RTM(!)时),Verisign的时间戳服务器(“ http://timestamp.verisign.com/scripts/timstamp.dll ”)决定间歇性地脱机。
在这种情况下我们该怎么办?
Answers:
我使用以下最大可循环300次的批处理文件。有两个参数,%1是包含批处理文件pfx文件和signtool.exe的文件夹的路径。%2是要签名的文件的完整路径。您可以在Visual Studio发布后事件中使用“ $(SolutionDir)thirdparty \ signing \ sign.bat”之类的名称来调用此命令。在每次迭代中使用不同的时间戳服务器。目前,它使用Comodo,Verisign,GlobalSign和Starfield。希望这是终极签名脚本;)
@echo off
REM create an array of timestamp servers...
set SERVERLIST=(http://timestamp.comodoca.com/authenticode http://timestamp.verisign.com/scripts/timestamp.dll http://timestamp.globalsign.com/scripts/timestamp.dll http://tsa.starfieldtech.com)
REM sign the file...
%1\signtool.exe sign /f %1\comodo.pfx /p videodigital %2
set timestampErrors=0
for /L %%a in (1,1,300) do (
for %%s in %SERVERLIST% do (
REM try to timestamp the file. This operation is unreliable and may need to be repeated...
%1\signtool.exe timestamp /t %%s %2
REM check the return value of the timestamping operation and retry a max of ten times...
if ERRORLEVEL 0 if not ERRORLEVEL 1 GOTO succeeded
echo Signing failed. Probably cannot find the timestamp server at %%s
set /a timestampErrors+=1
)
REM wait 2 seconds...
choice /N /T:2 /D:Y >NUL
)
REM return an error code...
echo sign.bat exit code is 1. There were %timestampErrors% timestamping errors.
exit /b 1
:succeeded
REM return a successful code...
echo sign.bat exit code is 0. There were %timestampErrors% timestamping errors.
exit /b 0
我还将http://timestamp.comodoca.com放到了受信任的站点中(感谢Vince)。我认为这可能是重要的一步。我也更新了PC上的根证书。
%%a
变量从不使用。for循环或注释中是否有错字?
/p
的值是* .pfx密码。
我不确定时间戳服务器是否必须由根CA拥有。
我们使用http://timestamp.comodoca.com/authenticode(并具有Comodo authenticode证书),但实际上存在类似的问题,因为其服务器似乎偶尔会出现错误或超时。我们在连续集成服务器上作为每晚(或按需)构建的一部分进行签名,仅适用于Release构建(不适用于Debug构建)。
我(主要)通过两种方式解决了这个问题:
在这些问题之间,由时间戳服务器问题引起的构建失败已经从每周一次或两次变为几乎从未发生过。
编辑:我有一个执行此操作的MSBuild任务(以及读取存储在存储库外部的证书密码),网址为https://gist.github.com/gregmac/4cfacea5aaf702365724
通过使用以下其中之一替换verisign时间戳URL,可以很好地工作:
http://timestamp.comodoca.com/authenticode
http://www.trustcenter.de/codesigning/timestamp
可以使用任何时间戳服务器:由于发现GlobalSign的服务器不可靠,我最近从发行者的时间戳服务器切换到了Verisign。此外,Thawte不会运行自己的时间戳服务器,但建议人们使用Verisign的时间戳服务器。
通常,您可以使用任何所需的时间戳服务。尽管大多数CA都会提供时间戳服务。例子
http://timestamp.globalsign.com/scripts/timstamp.dll
http://timestamp.comodoca.com/authenticode
http://www.startssl.com/timestamp
http://timestamp.digicert.com?alg=sha1
http://timestamp.digicert.com?alg=sha256
timestamp.verisign.com在2019年底正式停产,以了解更多信息,她对下面的问题充满信心。
我有同样的问题。对于某些我尝试签名的文件,verisign服务器有时无法访问(但同一版本中的其他文件已正确签名)。
我通常会重试,但它仍然有效,但今天没有办法。
因此,在互联网上进行了一些无用的研究之后,我尝试将http://*.verisign.com放到受信任的区域中,并且可以正常工作...最后,我不知道服务器是否有问题,现在是否可以正常工作,或者我是否做了对的事情,我想在未来几天会看到。希望它可以帮助其他被阻止的人。
服务器配置:Windows Server 2003 sp2,IE8,增强了安全性。
您可以使用Jsign代替signtool来对构建进行签名和时间戳记,它支持故障转移到其他时间戳记服务。
命令行语法如下所示:
jsign --keystore keystore.p12 --alias test --storepass password \
--tsaurl http://timestamp.comodoca.com/authenticode,http://timestamp.globalsign.com/scripts/timestamp.dll \
application.exe
您还可以配置尝试次数(使用--tsretries
)和两次尝试之间的延迟(使用--tsretrywait
)。