lnmp環境下使用acme.sh簽發Let's Encrypt出現錯誤解決記錄


最近在使用 lnmp腳本工具包 的時候 里面的acme.sh腳本簽發 Let's Encrypt證書報錯

Please refer to https://curl.haxx.se/libcurl/c/libcurl-errors.html for error code: 28

根據網上搜索,說是參數換成強制wget就行了,經過測試發現一樣不行,於是開始了折騰之路。

經過反復測試發現,在境外的主機上操作都是正常的,但是境內就不行,難道是網絡緣故?

思來想去,還是把簽發這個事放在境外吧。

於是新建一台境外實例,部署好lnmp,修改 php-fpm的配置文件 用戶名和用戶組都改成root (避免權限問題)然后 lnmp stop php-fpm

修改/etc/init.d/php-fpm 這個文件給php-fpm 添加一個啟動參數

php_opts=" -R --allow-to-run-as-root  --fpm-config $php_fpm_CONF --pid $php_fpm_PID"

修改/usr/local/php/etc/php.ini 

在disable_functions 里面去掉exec

修改/usr/local/nginx/conf/fastcgi.conf

fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/:/tmp/:/proc/:/usr/local/nginx/conf/ssl/";

添加:/usr/local/nginx/conf/ssl/

准備工作就緒(lnmp php-fpm start && lnmp nginx reload),假設這台機器的域名是 ca.com 解析放在阿里雲

在終端添加ssl虛擬主機,使用lnmp dns ali 然后根據lnmp的提示,添加好主機

再添加要幫忙簽的域名,使用 lnmp onlyssl ali ,例如這里添加 abc.com

然后在/usr/local/nginx/conf/ssl/ 目錄下可以找到對應域名的證書,我們只需要把文件復制到需要的服務器上就可以了,一般來說scp就行,但我采用了PHP更新的方案,所以這里要上代碼了

服務端,也就是ca.com服務器上部署

<?php
if(empty($_POST['domain']) || !is_valid_domain_name($_POST['domain']))
{
    exit;
}
//獲取域名的解析記錄
$ip = dns_get_record($_POST['domain'],DNS_A);
if(isset($ip[0]) && isset($ip[0]['ip']))
{
    $ip = $ip[0]['ip'];
}else
{
    exit;
}
//判斷訪問來源和域名是否一致
if($ip !== $_SERVER['REMOTE_ADDR'])
{
    echo 3;
    exit;
}
//驗證通過后開始打包證書文件
$base = '/usr/local/nginx/conf/ssl/';
$path = $base . $_POST['domain'] . '/';
if(file_exists($path))
{
    exec("cd '{$path}' && tar -czf {$_POST['domain']}.tgz ca.cer fullchain.cer {$_POST['domain']}.cer {$_POST['domain']}.csr {$_POST['domain']}.csr.conf {$_POST['domain']}.key");
    //計算hash
    $new_md5 = md5_file($path.$_POST['domain'].'.tgz');
    if($new_md5 !== $_POST['md5'])
    {
        send_file($path.$_POST['domain'].'.tgz');
    }
    echo 4;
}


//驗證域名合法性
function is_valid_domain_name($domain_name)
{

    return(
        preg_match("/^([a-z\d](-*[a-z\d])*)(\.([a-z\d](-*[a-z\d])*))*$/i", $domain_name) //valid chars check

        && preg_match("/^.{1,253}$/", $domain_name) //overall length check

        && preg_match("/^[^\.]{1,63}(\.[^\.]{1,63})*$/", $domain_name) //length of each label
    );

}
//發送文件
function send_file($file) 
{
    $size = filesize($file); 
    header("Content-type: application/octet-stream"); 
    header("Accept-Ranges: bytes"); 
    $begin = 0; 
    $end = $size - 1; 
    header("Content-Length: " . ($end - $begin + 1)); 
    header("Content-Disposition: attachment;filename=".basename($file)); 
    header("Content-Range: bytes ".$begin."-".$end."/".$size); 
    echo file_get_contents($file); 
} 
ca.php

然后在abc.com這台機器上(前提是部署好了lnmp網站,創建了ssl配置,由於是基礎這里不在贅述)創建 dnsca.php文件 內容如下

<?php
if(!isset($argv[1])) exit;

if(is_valid_domain_name($argv[1]))
{
    $domain_name = $argv[1];
}
//目錄不在就新建
$path = '/usr/local/nginx/conf/ssl/'.$domain_name.'/';
if(!file_exists($path))
{
    @mkdir($path,0777,true);
}
//文件hash
$now_hash = "0";
if(file_exists($path.$domain_name.'.tgz'))
{
    $now_hash = md5_file($path.$domain_name.'.tgz');
}
$now_hash = "0";
exec(' cd \''.$path.'\' && wget --post-data "domain='.urlencode($domain_name).'&md5='.$now_hash.'" --no-check-certificate -O '.$domain_name.'.tgz https://ca.com/ca.php');
$size = filesize($path.$domain_name.'.tgz'); 
if($size>1000)
{
    exec('cd \''.$path.'\' && tar -xzf '.$domain_name.'.tgz && lnmp nginx reload');
}

//驗證域名合法性
function is_valid_domain_name($domain_name)
{
    return(
        preg_match("/^([a-z\d](-*[a-z\d])*)(\.([a-z\d](-*[a-z\d])*))*$/i", $domain_name) //valid chars check

        && preg_match("/^.{1,253}$/", $domain_name) //overall length check

        && preg_match("/^[^\.]{1,63}(\.[^\.]{1,63})*$/", $domain_name) //length of each label
    );

}
View Code

設置好文件可執行權限,然后執行

/usr/bin/php dnsca.php abc.com 

也可以設置成crontab 任務 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM