【问题标题】:PHP , MySQL and SSL authenticationPHP , MySQL 和 SSL 认证
【发布时间】:2012-07-28 23:13:22
【问题描述】:

我有一个关于使用 SSL 证书构建身份验证系统的问题。我的想法是将数据存储在数据库中(我知道该怎么做),当用户提供证书时,系统会检查证书值并知道将用户放在哪里。但是有些事情不是很清楚(我可能听起来很笨,但不要评判我)

  1. 如何用PHP制作证书?
  2. 如何让系统向客户端请求特定的详细信息?(与 StartSSL 一样)
  3. 我必须签署私人证书吗?

P.S:如果这有什么不同,我正在使用 HostGator 商业计划。我已要求他们颁发私有 ssl 证书。

【问题讨论】:

    标签: php security ssl


    【解决方案1】:

    我从未使用过 StartSSL,但是现在许多个人和公司都使用 SSL API 和身份验证,例如新的(ish)Facebook sdk。

    请注意,许多浏览器和其他软件不支持将自签名证书作为有效的安全机制。

    您不能在 PHP 中制作 SSL 证书,而必须使用 OpenSSL 等工具制作。这是我在 Google 上找到的简短教程:http://www.akadia.com/services/ssh_test_certificate.html

    SSL 的主要设计目的是使跨线路的数据传输更加安全,并且在通过 PHP 读取连接时,您将验证证书以查看它是否与它应该匹配的证书匹配 (http://stackoverflow.xml)。 com/questions/3081042/how-to-get-ssl-certificate-info-with-curl-in-php)很像浏览器如何下载站点 SSL 证书,然后使用它来创建安全连接。我无法想象您会为每个用户提供一个证书。

    在此之后,您的所有数据都通过 HTTPS 而不是允许 SSL 身份验证的 HTTP。

    根据 SSL 身份验证系统,如果它是 API,那么您的 cURL 请求将通过 HTTPS 而不是 HTTP 发送。

    如果你是为网站上的登录页面做这个,那么它比我上面说的要简单得多(理论上,你仍然可以搞砸很多事情)。如果您正在这样做,那么您只需将 SSL 证书添加到您的服务器,然后将其添加到您的服务器配置(Google 的另一个 Apache 快速教程:http://www.digicert.com/ssl-certificate-installation-apache.htm),然后像往常一样将用户重定向到登录页面和登录处理页面的 https(如果您在 Apache 中,请确保您有 vhost443)。

    编辑:Openssl 确实有一个 PHP API,因为我刚刚记得所以我错了。

    这就是我看到 SSL 身份验证失败的方式。

    【讨论】:

    • 如果我使用有效的 CA 签署证书怎么办? openssl_csr_sign();如果我有一个 CA,则需要一个 CA,并且我有 =D 证书是否有效?
    • @D.Dimitrov 确实,如果它是由有效的提供商签名的,它将被视为有效,只有当您自己签名时才会出现问题。
    • @D.Dimitrov 所以要回答Do I have to sign the private certificate or something? 不,你会让你的 CA 签署它。
    • 所以我必须用站点证书颁发者的 CA.cert 对它们进行签名,否则只要使用有效的 CA 签名就没有关系?
    • @D.Dimitrov 没关系,只要它是由授权的人签署的,所以如果您认为您的托管服务提供商(激活certs) 正在敲诈你。尽管他们激活证书可能包括签名,但请与他们核实一下,您可能已经用一块石头击中了两只鸟。
    【解决方案2】:

    1) 用PHP创建新的SSL证书的方法^

        $dn = array(
            "countryName" => 'Country',
            "organizationName" => 'Org',
            "commonName" => 'Common name',
            "emailAddress" => 'email@email.com',
        );
    
        $configArgs = array(
            'digest_alg' => 'SHA1',
        );
    
        $clientKey = openssl_pkey_new();
        $csr = openssl_csr_new($dn, $clientKey, $configArgs);
    
        $password = trim(base64_encode(openssl_random_pseudo_bytes(8)), '/=');
    
        $cert = openssl_csr_sign(
            $csr,
            'file:///etc/ssl/ca/ca.pem',
            'file:///etc/ssl/ca/ca.pem',
            1095,
            $configArgs,
            $serial
        );
    
        openssl_pkcs12_export($cert, $clientCertPkcs12, $clientKey, $password);
        openssl_x509_free($cert);
        $sslData = array(
            'serial' => $serial, // random serial
            'sslkey' => $password,
            'created_at' => time(),
            'sslpfx' => $clientCertPkcs12
        );
    
        openssl_pkey_free($clientKey);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-31
      • 2016-12-30
      • 1970-01-01
      • 2017-02-06
      • 1970-01-01
      相关资源
      最近更新 更多