我在服务器上设置了一个 (私有) apt 存储库。我只允许通过 SSL 访问此存储库,并且只能使用客户端证书。我已使用 curl 测试了连接:
$ curl --cacert /opt/CA.crt --cert /opt/user.crt --key /opt/user.key --pass 1234 https://example.com/dists/lucid/main/binary-amd64/Packages.gz
内容按预期下载。
我在 /etc/apt/apt.conf.d/45example-com 中创建了一个文件,其中包含
Debug::Acquire::https "true";
Acquire::https::example.com {
Verify-Peer "true";
Verify-Host "true";
CaInfo "/opt/CA.crt";
SslCert "/opt/user.crt";
SslKey "/opt/user.key";
};
我在 /etc/apt/sources.list.d/example.com.list 添加了一个文件,内容如下:
deb https://example.com/ lucid main
CA 证书似乎有问题,当我尝试更新时,出现以下信息:
# apt-get update
* Connected to example.com (8.0.0.8) port 443 (#0)
* found 1 certificates in /opt/CA.crt
* error reading X.509 key or certificate file
* Closing connection #0
example.com 上的服务器日志显示没有收到任何请求,因此我猜测 apt-get 在尝试发送请求(与日志所述的内容相符)之前就失败了。
我很难在互联网上找到有关 apt-get 和 ssl 的任何文档,甚至无法找到源代码。
有人有什么想法吗?
答案1
经过一番搜索后,我对正在发生的事情有了更好的了解(但还没有解决方案)。
我找到了 apt 的源代码https://code.launchpad.net/~ubuntu-branches/ubuntu/lucid/apt/lucid。它使用 libcurl 进行 ssl,而后者又使用 gntls。
错误消息来自 libcurl,它抱怨的是密钥/密码,而不是 CA 证书。行:
* found 1 certificates in /opt/CA.crt
表示 CA.crt 已正确加载。错误消息来自以下方面:
if(gnutls_certificate_set_x509_key_file(
conn->ssl[sockindex].cred,
data->set.str[STRING_CERT],
data->set.str[STRING_KEY] ?
data->set.str[STRING_KEY] : data->set.str[STRING_CERT],
do_file_type(data->set.str[STRING_CERT_TYPE]) ) !=
GNUTLS_E_SUCCESS) {
failf(data, "error reading X.509 key or certificate file");
return CURLE_SSL_CONNECT_ERROR;
}
(来自 gtls.c 中的http://alpha.gnu.org/gnu/gnutls/libtasn1-0.2.10.tar.gz)
问题出在与该密钥关联的密码上。我使用以下命令从密钥中删除了密码:
$ openssl rsa -in user.key -out user-nopasswd.key
这并不理想,但似乎有效。
答案2
我在尝试让 apt-get 通过 https 运行时遇到的一个问题是安全证书你不能使用.pem文件,因为 apt-get 无法将其识别为用于连接到存储库的有效格式。我有一个自签名 .pem 文件,用于连接到我的网络服务器,它是 .pem 格式,这就是我尝试使用它的原因。
解决方案是将 .pem 拆分为正确的文件 .crt 和 .key,然后 apt-get 即可成功连接。
总结:分割你的.pem文件放入.crt和一个。钥匙并且它会起作用。
答案3
实际上,您不必像@ihatecache 所述那样拆分它们,您可以将证书和密钥都设置为单个 pem:
Acquire::https {
SslCert "/opt/user.pem";
SslKey "/opt/user.pem";
};