在Tcl中将客户端证书发送到服务器

时间:2013-03-29 13:33:08

标签: ssl-certificate tcl

目前,我的应用程序(在C中)使用SSL证书对Web服务器进行身份验证。我现在将大部分功能(如果不是全部)移到Tcl。

我找不到任何关于如何做的教程或示例(我更喜欢使用Tcl :: http ::但是TclCurl会很好)。

有什么建议吗?

由于

2 个答案:

答案 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行。