PHP 使用 SSL 证书身份验证到 EPP API 的 TCP 连接

PHP TCP connection to EPP API using SSL certificate authentication

我试过这个向上和向后都没有成功。国家域名注册部门已决定将其整个系统更改为 EPP。他们的文档很差,但总结一下:

仪表板一团糟。我无法将相同的证书上传给不同的用户,我无法删除用户等。无论如何,您应该连接到该地址并在请求中使用相同的 SSL 证书来验证自己(至少这是我所理解的)但我无法让它工作。我所有的请求 return:

Error 7: "Failed to connect to epptest.ficora.fi port 700: Timed out"

我根据我在 POST 请求中发送的文档创建了一个登录 XML。

    ini_set('max_execution_time', 300);
    set_time_limit(0);

    $curl = curl_init();

    curl_setopt($curl, CURLOPT_URL, 'epptest.ficora.fi');
    curl_setopt($curl, CURLOPT_PORT, 700);
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $content);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT ,0);
    curl_setopt($curl, CURLOPT_TIMEOUT, 400);
    curl_setopt($curl, CURLOPT_SSLCERT, __DIR__ . '/certificate.crt');

    $output = curl_exec($curl);
    echo 'Error ' . curl_errno($curl) . ': "' . curl_error($curl) .'"';
    curl_close($curl);

可以找到证书文件,我做了一个file_get_contents()测试,读取OK。这是 Windows 计算机上的本地主机测试。

在我自己的(实时)服务器上测试相同的代码我得到:

Error 56: "Recv failure: Connection reset by peer"

我不知道这听起来是否愚蠢,但请求是否必须来自使用 SSL 证书的服务器、地址?

我完全不知道为什么它不起作用。有人帮忙吗?

编辑

Here's the cURL verbose information:

* About to connect() to epptest.ficora.fi port 700 (#0)
* Trying <ip_address>
* connected
* Connected to epptest.ficora.fi (<ip address>) port 700 (#0)
> POST / HTTP/1.1
Host: epptest.ficora.fi:700
Accept: */*
Content-type: text/xml
Content-length: 146

* upload completely sent off: 146 out of 146 bytes
* additional stuff not fine transfer.c:1037: 0 0
* Recv failure: Connection reset by peer
* Closing connection #0

我从 epptest.ficora fi:

中看到了两种错误
  • 连接超时表示IP地址不允许连接。

  • 对等方重置连接表明证书无效。

这个周末我的所有连接都失败了,连接被对等方重置。今天 (29.8.2016) 它又开始工作了,所以这可能是一个暂时的问题。到目前为止,我已经看到使用 CAcert 服务器证书和 Comodo FreeSSL 证书的成功身份验证。

但是,我前两天启用的IP地址仍然被阻止。他们每 8 小时自动更新一次的防火墙可能没有像记录的那样工作,您需要联系 Ficora 支持 (fi-domain-tech@ficora.fi) 来打开 IP。

此外,我认为 curl 不支持 EPP,因此在这种情况下它可能没有用。 (EPP 是在 TCP 端口 700 上使用的自定义协议。它不基于 HTTP。)

最后的答案是通过另一个Whosebug post找到的。我实际上在证书中没有私钥,所以我要做的是创建一个新的 .pem 文件(在任何编辑器中都是纯文本)并将私钥和证书粘贴到其中,如下所示:

-----BEGIN RSA PRIVATE KEY-----

-----END RSA PRIVATE KEY-----

-----BEGIN CERTIFICATE----

-----END CERTIFICATE-----

证书中应该包含密钥。我所拥有的只是它们分开。没有人真正指出这一点。

然而!我无法在 cURL 中完成这项工作。我得到的响应是通过使用 stream_socket_client() 函数的 PHP-EPP 库。