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

时间:2016-08-25 18:55:28

标签: php ssl tcp epp

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

  • 通过TCP连接:epptest.ficora.fi port 700
  • 要将防火墙列入白名单,请在仪表板上为用户帐户添加IP地址和SSL证书(完成该操作)

仪表板完全混乱。我无法将相同的证书上传到不同的用户,我无法删除用户等。无论如何,你应该连接到该地址并验证自己在请求中使用相同的SSL证书(至少这是我所理解的)但我无法让它发挥作用。我的所有要求都会返回:

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

2 个答案:

答案 0 :(得分:1)

我从epptest.ficora fi中看到了两种错误:

  • 连接超时表示不允许连接IP地址。

  • 通过对等方重置连接表示证书无效。

这个周末所有的连接都因同步连接重置而失败。今天(2016年8月29日)它再次开始工作,所以这可能是一个暂时的问题。到目前为止,我已经看到使用CAcert服务器证书和Comodo FreeSSL证书成功进行身份验证。

但是,我两天前启用的IP地址仍然被阻止。它们每8小时更新一次的自动防火墙可能无法按照文档记录,并且您需要联系Ficora支持(fi-domain-tech@ficora.fi)来打开IP。

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

答案 1 :(得分:1)

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

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

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

-----BEGIN CERTIFICATE----

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

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

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