作者 刘锟

域名证书到期更新

@@ -36,37 +36,113 @@ class DomainInfo extends Command @@ -36,37 +36,113 @@ class DomainInfo extends Command
36 * @method :post 36 * @method :post
37 * @time :2023/9/11 15:09 37 * @time :2023/9/11 15:09
38 */ 38 */
39 - public function handle(){ 39 + public function handle()
  40 + {
  41 + //更新域名到期时间
  42 + $this->startUpdateDomain();
  43 +
  44 + //主站证书到期更新
  45 + $this->startUpdateCert();
  46 +
  47 + //AMP站证书到期更新
  48 + $this->startUpdateAmpCert();
  49 +
  50 + return 1;
  51 + }
  52 +
  53 + /**
  54 + * 更新域名到期时间
  55 + * @author Akun
  56 + * @date 2024/02/26 10:26
  57 + */
  58 + public function startUpdateDomain()
  59 + {
  60 + $domainModel = new DomainInfoModel();
  61 + $map = [
  62 + 'status' => ['!=', 2],
  63 + 'domain_end_time' => ['<', date('Y-m-d H:i:s')]
  64 + ];
  65 + $list = $domainModel->list($map);
  66 + foreach ($list as $v) {
  67 + $time = $this->updateDomain($v['domain']);
  68 + $data = [
  69 + 'domain_start_time' => $time['start'],
  70 + 'domain_end_time' => $time['end']
  71 + ];
  72 +
  73 + $domainModel->edit($data, ['id' => $v['id']]);
  74 + }
  75 + }
  76 +
  77 + /**
  78 + * 主站证书到期更新
  79 + * @author Akun
  80 + * @date 2024/02/26 10:26
  81 + */
  82 + public function startUpdateCert()
  83 + {
40 $domainModel = new DomainInfoModel(); 84 $domainModel = new DomainInfoModel();
41 - $map = ['status'=>['!=',2]]; 85 + $end_day = date('Y-m-d H:i:s', time() + 2 * 24 * 3600);//2天后到期
  86 + $map = [
  87 + 'status' => ['!=', 2],
  88 + 'certificate_end_time' => ['<', $end_day]
  89 + ];
42 $list = $domainModel->list($map); 90 $list = $domainModel->list($map);
43 - foreach ($list as $v){  
44 - if(empty($v['private_key']) || empty($v['private_cert'])){  
45 - //域名结束时间<2天时,重新生成  
46 - if(!empty($v['certificate_end_time'])){  
47 - if(($v['certificate_end_time'] > date('Y-m-d H:i:s',time() + 24*3600)) || ($v['certificate_end_time'] < date('Y-m-d H:i:s',time()))){ 91 + foreach ($list as $v) {
  92 + //更新证书到期时间
  93 + $data = [];
  94 + $ssl = $this->updateDomainSsl($v['domain']);
  95 + $ssl['from'] && $data['certificate_start_time'] = $ssl['from'];
  96 + $ssl['to'] && $data['certificate_end_time'] = $ssl['to'];
  97 +
  98 + $domainModel->edit($data, ['id' => $v['id']]);
  99 +
  100 + if($v['type'] == 1 && ($data['certificate_end_time'] ?? '') < $end_day){
  101 + //申请免费证书
48 $this->updatePrivate($v); 102 $this->updatePrivate($v);
49 } 103 }
50 } 104 }
51 } 105 }
52 - $ssl = $this->updateDomainSsl($v['domain']);  
53 - $time = $this->updateDomain($v['domain']);  
54 - if(!empty($time['start']) && !!empty($time['end'])){  
55 - $data = [  
56 - 'certificate_start_time'=>$ssl['from'],  
57 - 'certificate_end_time'=>$ssl['to'],  
58 - 'domain_start_time'=>$time['start'],  
59 - 'domain_end_time'=>$time['end']  
60 - ];  
61 - }else{  
62 - $data = [  
63 - 'domain_start_time'=>$time['start'],  
64 - 'domain_end_time'=>$time['end'] 106 +
  107 + /**
  108 + * AMP站证书到期更新
  109 + * @author Akun
  110 + * @date 2024/02/26 10:26
  111 + */
  112 + public function startUpdateAmpCert()
  113 + {
  114 + $domainModel = new DomainInfoModel();
  115 + $end_day = date('Y-m-d H:i:s', time() + 2 * 24 * 3600);//2天后到期
  116 + $map = [
  117 + 'status' => ['!=', 2],
  118 + 'amp_status' => ['=', 1],
  119 + 'amp_certificate_end_time' => ['<', $end_day]
65 ]; 120 ];
  121 + $list = $domainModel->list($map);
  122 + foreach ($list as $v) {
  123 + //更新amp站点证书到期时间
  124 + $domain_array = parse_url($v['domain']);
  125 + $host = $domain_array['host'] ?? $domain_array['path'];
  126 + $host_array = explode('.', $host);
  127 + if (count($host_array) <= 2) {
  128 + array_unshift($host_array, 'm');
  129 + } else {
  130 + $host_array[0] = 'm';
  131 + }
  132 + $amp_domain = implode('.', $host_array);
  133 +
  134 + $data = [];
  135 + $ssl = $this->updateDomainSsl($amp_domain);
  136 + $ssl['from'] && $data['amp_certificate_start_time'] = $ssl['from'];
  137 + $ssl['to'] && $data['amp_certificate_start_time'] = $ssl['to'];
  138 +
  139 + $domainModel->edit($data, ['id' => $v['id']]);
  140 +
  141 + if($v['amp_type'] == 1 && ($data['amp_certificate_start_time'] ?? '') < $end_day){
  142 + //申请免费证书
  143 + $this->updateAmpPrivate($v['domain']);
66 } 144 }
67 - $domainModel->edit($data,['id'=>$v['id']]);  
68 } 145 }
69 - return 1;  
70 } 146 }
71 147
72 /** 148 /**
@@ -78,7 +154,7 @@ class DomainInfo extends Command @@ -78,7 +154,7 @@ class DomainInfo extends Command
78 */ 154 */
79 public function updatePrivate($param) 155 public function updatePrivate($param)
80 { 156 {
81 - $url = 'https://' . $param['domain']. '/api/applySsl/'; 157 + $url = 'https://' . $param['domain'] . '/api/applySsl/';
82 $top_domain = $this->getTopDomain($param['domain']); 158 $top_domain = $this->getTopDomain($param['domain']);
83 if ((empty($extend_config) || empty($extend_config[0]['origin'])) && $param['id'] != 3) { 159 if ((empty($extend_config) || empty($extend_config[0]['origin'])) && $param['id'] != 3) {
84 $extend_config = [ 160 $extend_config = [
@@ -89,21 +165,39 @@ class DomainInfo extends Command @@ -89,21 +165,39 @@ class DomainInfo extends Command
89 'project_id' => $param['project_id'], 165 'project_id' => $param['project_id'],
90 'type' => 1, 166 'type' => 1,
91 'route' => 1, 167 'route' => 1,
92 - "domain" =>$param['domain'],  
93 - "rewrite"=> $extend_config ?? [], 168 + "domain" => $param['domain'],
  169 + "rewrite" => $extend_config ?? [],
94 'other_domain' => [$top_domain, '*.' . $top_domain], 170 'other_domain' => [$top_domain, '*.' . $top_domain],
95 'private_key' => '', 171 'private_key' => '',
96 'cert' => '' 172 'cert' => ''
97 ]; 173 ];
98 - $result = $this->curlRequest($url, $param); 174 + return $this->curlRequest($url, $param);
99 } 175 }
100 176
101 - public static function getTopDomain ($url) { 177 + /**
  178 + * 更新证书
  179 + * @param $domain
  180 + * @return array
  181 + * @author Akun
  182 + * @date 2024/02/26 10:25
  183 + */
  184 + public function updateAmpPrivate($domain){
  185 + $url = 'https://' . $domain . '/api/createSiteAmp/';
  186 + $param = [
  187 + "domain" => $domain,
  188 + 'private_key' => '',
  189 + 'cert' => ''
  190 + ];
  191 + return $this->curlRequest($url, $param);
  192 + }
  193 +
  194 + public static function getTopDomain($url)
  195 + {
102 $url = strtolower($url); //首先转成小写 196 $url = strtolower($url); //首先转成小写
103 $url = mb_ereg_replace('^( | )+', '', trim($url)); 197 $url = mb_ereg_replace('^( | )+', '', trim($url));
104 $url = mb_ereg_replace('( | )+$', '', $url); 198 $url = mb_ereg_replace('( | )+$', '', $url);
105 if (!preg_match('/^(http:\/\/|https)/', $url)) { 199 if (!preg_match('/^(http:\/\/|https)/', $url)) {
106 - $url = "https://".$url; 200 + $url = "https://" . $url;
107 } 201 }
108 $hosts = parse_url($url); 202 $hosts = parse_url($url);
109 $host = $hosts['host'] ?? ''; 203 $host = $hosts['host'] ?? '';
@@ -117,10 +211,10 @@ class DomainInfo extends Command @@ -117,10 +211,10 @@ class DomainInfo extends Command
117 $preg = '/[\w].+\.(com|net|org|gov|edu|co|ne)\.[\w]/'; 211 $preg = '/[\w].+\.(com|net|org|gov|edu|co|ne)\.[\w]/';
118 if (($n > 2) && preg_match($preg, $host)) { 212 if (($n > 2) && preg_match($preg, $host)) {
119 //双后缀取后3位 213 //双后缀取后3位
120 - $host = $data[$n - 3].'.'.$data[$n - 2].'.'.$data[$n - 1]; 214 + $host = $data[$n - 3] . '.' . $data[$n - 2] . '.' . $data[$n - 1];
121 } else { 215 } else {
122 //非双后缀取后两位 216 //非双后缀取后两位
123 - $host = $data[$n - 2].'.'.$data[$n - 1]; 217 + $host = $data[$n - 2] . '.' . $data[$n - 1];
124 } 218 }
125 return $host; 219 return $host;
126 } 220 }
@@ -155,7 +249,8 @@ class DomainInfo extends Command @@ -155,7 +249,8 @@ class DomainInfo extends Command
155 * @method :post 249 * @method :post
156 * @time :2023/9/11 15:07 250 * @time :2023/9/11 15:07
157 */ 251 */
158 - public function updateDomainSsl($domain){ 252 + public function updateDomainSsl($domain)
  253 + {
159 try { 254 try {
160 $context = stream_context_create([ 255 $context = stream_context_create([
161 'ssl' => [ 256 'ssl' => [
@@ -163,22 +258,22 @@ class DomainInfo extends Command @@ -163,22 +258,22 @@ class DomainInfo extends Command
163 'capture_peer_cert_chain' => false, 258 'capture_peer_cert_chain' => false,
164 ], 259 ],
165 ]); 260 ]);
166 - $stream = stream_socket_client('ssl://'.$domain.':443', $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);  
167 - if(!$stream) { 261 + $stream = stream_socket_client('ssl://' . $domain . ':443', $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);
  262 + if (!$stream) {
168 die("Failed to connect: $errno - $errstr"); 263 die("Failed to connect: $errno - $errstr");
169 } 264 }
170 $remote_cert = stream_context_get_params($stream)['options']['ssl']['peer_certificate']; 265 $remote_cert = stream_context_get_params($stream)['options']['ssl']['peer_certificate'];
171 - if(!$remote_cert) { 266 + if (!$remote_cert) {
172 die("Failed to retrieve certificate"); 267 die("Failed to retrieve certificate");
173 } 268 }
174 $valid_from = date('Y-m-d H:i:s', openssl_x509_parse($remote_cert)['validFrom_time_t']); 269 $valid_from = date('Y-m-d H:i:s', openssl_x509_parse($remote_cert)['validFrom_time_t']);
175 $valid_to = date('Y-m-d H:i:s', openssl_x509_parse($remote_cert)['validTo_time_t']); 270 $valid_to = date('Y-m-d H:i:s', openssl_x509_parse($remote_cert)['validTo_time_t']);
176 fclose($stream); 271 fclose($stream);
177 - }catch (\Exception $e){ 272 + } catch (\Exception $e) {
178 $valid_from = ''; 273 $valid_from = '';
179 $valid_to = ''; 274 $valid_to = '';
180 } 275 }
181 - return ['from'=>$valid_from,'to'=>$valid_to]; 276 + return ['from' => $valid_from, 'to' => $valid_to];
182 } 277 }
183 278
184 /** 279 /**
@@ -188,15 +283,16 @@ class DomainInfo extends Command @@ -188,15 +283,16 @@ class DomainInfo extends Command
188 * @method :post 283 * @method :post
189 * @time :2023/9/11 15:11 284 * @time :2023/9/11 15:11
190 */ 285 */
191 - public function updateDomain($domain){  
192 - $url = 'http://openai.waimaoq.com/v1/whois_api?domain='.$domain; 286 + public function updateDomain($domain)
  287 + {
  288 + $url = 'http://openai.waimaoq.com/v1/whois_api?domain=' . $domain;
193 $response = http_get($url); 289 $response = http_get($url);
194 $start = date('Y-m-d H:i:s'); 290 $start = date('Y-m-d H:i:s');
195 $end = date('Y-m-d H:i:s'); 291 $end = date('Y-m-d H:i:s');
196 - if($response['code'] == 200){ 292 + if ($response['code'] == 200) {
197 $start = $response['text']['creation_date']; 293 $start = $response['text']['creation_date'];
198 $end = $response['text']['expiration_date']; 294 $end = $response['text']['expiration_date'];
199 } 295 }
200 - return ['start'=>$start,'end'=>$end]; 296 + return ['start' => $start, 'end' => $end];
201 } 297 }
202 } 298 }