目前,我的应用程序(在C中)使用SSL证书对Web服务器进行身份验证。我现在将大部分功能(如果不是全部)移到Tcl。
我找不到任何关于如何做的教程或示例(我更喜欢使用Tcl :: http ::但是TclCurl会很好)。
有什么建议吗?
由于
答案 0 :(得分:3)
约翰内斯的回答是正确的,除非您想为不同的网站提供不同的身份。在这种情况下,您使用tls::init
,它允许您在调用该命令之前将默认的TLS相关选项设置为tls::socket
。
package require http
package require tls
http::register https 443 ::tls::socket
# Where is our identity?
tls::init -keyfile "my_key.p12" -cafile "the_server_id.pem"
# Now, how to provide the password (don't know what the arguments are)
proc tls::password args {
return "the_pass"; # Return whatever the password is
}
# Do the secure connection
set token [http::geturl https://my.secure.site/]
# Disable the key
tls::init -keyfile {}
请注意,提供密码的方式是奇怪的,我确信这种机制在进行异步连接时不会很好。 (有一个常设功能请求,用于改进http和tls包之间的集成......)
答案 1 :(得分:2)
要将https与tcl一起使用,通常使用tls
包。 http package的手册页为您提供了如何执行此操作的示例:
package require http
package require tls
::http::register https 443 ::tls::socket
set token [::http::geturl https://my.secure.site/]
如果您阅读tls::socket
的{{3}}包的文档,您会发现有一些选项可以传递客户端证书。结合使用可以:
::http::register https 443 [list ::tls::socket \
-cafile caPublic.pem -certfile client.pem]
如果证书文件受密码保护,则可能必须指定-password
回调参数。
请注意,此解决方案使用来自您的应用程序的每个https(无论目标)请求的客户端证书。
修改:正如Donal建议的那样,使用tls::init
可能比使用::http::register
指定它更好。
一个例子:
package require http
package require tls
::http::register https 443 ::tls::socket
proc ::get_cert_pass {} {
return "passw0rd"
}
# Add the options here
::tls::init -cafile caPublic.pem -certfile client.pem -password ::get_cert_pass
set tok [::http::geturl https://my.secure.site/]
要执行请求,请始终使用最后2行。