Passed
Push — develop ( 974831...7c221a )
by Nikita
06:16
created

CertificateService   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 124
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 62
dl 0
loc 124
rs 10
c 0
b 0
f 0
wmc 7

5 Methods

Rating   Name   Duplication   Size   Complexity  
A generate() 0 20 2
A generateRoot() 0 11 1
A fingerprintString() 0 4 1
A certificateInfo() 0 24 1
A signCertificate() 0 18 2
1
<?php
2
3
namespace Gameap\Services;
4
5
use Illuminate\Support\Facades\Storage;
6
use Carbon\Carbon;
7
8
class CertificateService
9
{
10
    const ROOT_CA = 'certs/root.crt';
11
    const ROOT_KEY = 'certs/root.key';
12
13
    const CERT_DN = [
14
        "countryName" => "RU",
15
        "stateOrProvinceName" => "GameAP",
16
        "localityName" => "GameAP",
17
        "organizationName" => "GameAP.ru",
18
        "organizationalUnitName" => "Development",
19
        "commonName" => "GameAP",
20
        "emailAddress" => "[email protected]"
21
    ];
22
23
    const CERT_DAYS = 3650;
24
25
    /**
26
     * Generate root certificate
27
     */
28
    static public function generateRoot()
29
    {
30
        $privateKey = openssl_pkey_new();
31
        $csr = openssl_csr_new(self::CERT_DN, $privateKey);
32
        $certificate = openssl_csr_sign($csr, null, $privateKey, 3650);
33
34
        openssl_x509_export($certificate, $pemCertificate);
35
        openssl_pkey_export($privateKey, $pemPrivateKey);
36
37
        Storage::put(self::ROOT_CA, $pemCertificate);
38
        Storage::put(self::ROOT_KEY, $pemPrivateKey);
39
    }
40
41
    /**
42
     * @param $certificatePath string   path to certificate in storage
43
     * @param $keyPath string   path to key in storage
44
     */
45
    static public function generate($certificatePath, $keyPath)
46
    {
47
        $privateKey = openssl_pkey_new();
48
        $csr = openssl_csr_new(self::CERT_DN, $privateKey);
49
50
        if (!Storage::exists(self::ROOT_CA)) {
51
            self::generateRoot();
52
        }
53
54
        $rootCa = Storage::get(self::ROOT_CA);
55
        $rootKey = Storage::get(self::ROOT_KEY);
56
        $certificate = openssl_csr_sign($csr, $rootCa, $rootKey, 3650);
57
58
        openssl_x509_export($certificate, $pemCertificate);
59
        openssl_pkey_export($privateKey, $pemPrivateKey);
60
61
        Storage::makeDirectory('certs');
62
63
        Storage::put($certificatePath, $pemCertificate);
64
        Storage::put($keyPath, $pemPrivateKey);
65
    }
66
67
    /**
68
     * @param $certificatePath
69
     *
70
     * @return string
71
     */
72
    static public function fingerprintString($certificatePath)
73
    {
74
        $fingerpring = openssl_x509_fingerprint(Storage::get($certificatePath), 'sha1');
0 ignored issues
show
Bug introduced by
Illuminate\Support\Facad...::get($certificatePath) of type Illuminate\Contracts\Filesystem\Filesystem is incompatible with the type string expected by parameter $x509 of openssl_x509_fingerprint(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

74
        $fingerpring = openssl_x509_fingerprint(/** @scrutinizer ignore-type */ Storage::get($certificatePath), 'sha1');
Loading history...
75
        return strtoupper(implode(':', str_split($fingerpring, 2)));
76
    }
77
78
    /**
79
     * @param $certificatePath
80
     *
81
     * @return array
82
     */
83
    static public function certificateInfo($certificatePath)
84
    {
85
        $parsed = openssl_x509_parse(Storage::get($certificatePath));
86
87
        return [
88
            'expires' => Carbon::createFromTimestamp($parsed['validTo_time_t'])->toDateTimeString(),
89
90
            'signature_type' => $parsed['signatureTypeSN'],
91
92
            'country' => $parsed['subject']['C'],
93
            'state' => $parsed['subject']['ST'],
94
            'locality' => $parsed['subject']['L'],
95
            'organization' => $parsed['subject']['O'],
96
            'organizational_unit' => $parsed['subject']['OU'],
97
            'common_name' => $parsed['subject']['CN'],
98
            'email' => $parsed['subject']['emailAddress'],
99
100
            'issuer_country' => $parsed['issuer']['C'],
101
            'issuer_state' => $parsed['issuer']['ST'],
102
            'issuer_locality' => $parsed['issuer']['L'],
103
            'issuer_organization' => $parsed['issuer']['O'],
104
            'issuer_organizational_unit' => $parsed['issuer']['OU'],
105
            'issuer_common_name' => $parsed['issuer']['CN'],
106
            'issuer_email' => $parsed['issuer']['emailAddress'],
107
        ];
108
    }
109
110
    /**
111
     * @param $csrPath
112
     * @return string
113
     */
114
    static public function signCertificate($csrPath)
115
    {
116
        if (!Storage::exists(self::ROOT_CA)) {
117
            self::generateRoot();
118
        }
119
120
        $rootCa = Storage::get(self::ROOT_CA);
121
        $rootKey = Storage::get(self::ROOT_KEY);
122
        $certificate = Storage::get($csrPath);
123
124
        $signedCertificate = openssl_csr_sign($certificate, $rootCa, $rootKey, 3650);
125
        openssl_x509_export($signedCertificate, $pemCertificate);
126
127
        $pathinfo = pathinfo($csrPath);
128
        $signedCertificatePath = $pathinfo['dirname'] . '/' . $pathinfo['filename'] . '.crt';
129
130
        Storage::put($signedCertificatePath, $pemCertificate);
131
        return $signedCertificatePath;
132
    }
133
}