Hướng dẫn php ssl certificate

Trong bài viết này sẽ sử dụng tên miền ảo làm ví dụ là site.test

1. Vào thư mục Apache trong XAMPP.

Mặc định XAMPP đợc cài đặt trong thư mục C:\xampp\apache.

2. Tạo một thư mục mới.

Đây là nơi ta sẽ lưu trữ chứng chỉ SSL. Trong ví dụ này Ngôi Sao Số sẽ tạo thư mục crt ,Vì vậy, đường dẫn sẽ có dạng C:\xampp\apache\crt

3. Tải về và thêm 2 tập tin này vào thư mục vừa tạo

Vào đường dẫn sau tải 2 tập tin cert.conf make-cert.bat về. 2 tập tin này sẽ dùng để tạo chứng chỉ SSL cho tên miền tùy thích.

4. Sửa cert.conf và chạy make-cert.bat

Mở file cert.conf và thay đổi {{DOMAIN}} thành tên miền bạn muốn, trong trường hợp này site.test và lưu lại.

Nhấp đúp chuột vào make-cert.bat và nhập tên miền site.test khi được nhắc. Và nhập trả lời cho các câu hỏi khác, thiết lập mặc định có sẵn trong cert.conf

5. Cài đặt chứng chỉ trong windows.

Sau đó, bạn sẽ thấy thư mục site.test được tạo. Trong thư mục đó ta sẽ có server.crt and server.key. Đây là chứng chỉ SSL certificate.

Nhấp đúp chuột vào server.crt để cài đặt nó trên Windows để Windows chấp nhận chứng chỉ này.

Và chọn Local Machine trong Store Location.

Tiếp tục chọn “Place all certificate in the following store” và click browse sau đó chọn Trusted Root Certification Authorities.

Chọn Next và Finish.

Và bây giờ chứng chỉ này đã được cài đặt là tin cậy [trusted] trong Windows. Tiếp theo là làm thế nào để sử dụng chứng chỉ này trong XAMPP.

6. Thêm trang web trong máy chủ Windows

  1. Mở notepad với quyền administrator.
  2. Sửa C:\Windows\System32\drivers\etc\hosts
  3. Thêm một dòng mới:
 
127.0.0.1 site.test

Điều này sẽ giúp XAMPP khi truy cập //site.test sẽ trỏ tên miền này về IP localhost

7. Thêm tên miền này vào file conf của XAMPP.

Giờ bạn cần kích hoạt SSL cho tên miền này và cho XAMPP biết nơi lưu trữ Chứng chỉ SSL. Vì vậy, bạn cần chỉnh sửa C:\xampp\apache\conf\extra\httpd-xampp.conf

Và thêm dòng mới này dưới cùng:

## site.test
 
     DocumentRoot "C:/xampp/htdocs"
     ServerName site.test
     ServerAlias *.site.test
 
 
     DocumentRoot "C:/xampp/htdocs"
     ServerName site.test
     ServerAlias *.site.test
     SSLEngine on
     SSLCertificateFile "crt/site.test/server.crt"
     SSLCertificateKeyFile "crt/site.test/server.key"
 

Sau đó, bạn sẽ cần khởi động lại Apache trong XAMPP. Đơn giản, chỉ cần mở Bảng điều khiển XAMPP và bấm stop và start tại mục Apache.

Mẹo: Trong file conf XAMPP, bạn có thể thay đổi thư mục gốc cho từng tên miền nếu cần.

8. Khởi động lại trình duyệt và thử lại!

Cần khởi động lại trình duyệt để hệ thống tải chứng chỉ. Và truy cập tên miền trên trình duyệt của bạn, và bạn sẽ thấy khóa màu xanh lá như hình bên dưới!

Ngôi Sao Số hy vọng hướng dẫn này hữu ích!

[PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8]

openssl_csr_newGenerates a CSR

Description

Note: You need to have a valid openssl.cnf installed for this function to operate correctly. See the notes under the installation section for more information.

Parameters

distinguished_names

The Distinguished Name or subject fields to be used in the certificate.

private_key

private_key should be set to a private key that was previously generated by openssl_pkey_new[] [or otherwise obtained from the other openssl_pkey family of functions]. The corresponding public portion of the key will be used to sign the CSR.

options

By default, the information in your system openssl.conf is used to initialize the request; you can specify a configuration file section by setting the config_section_section key of options. You can also specify an alternative openssl configuration file by setting the value of the config key to the path of the file you want to use. The following keys, if present in options behave as their equivalents in the openssl.conf, as listed in the table below.

Configuration overrides options keytypeopenssl.conf equivalentdescription
digest_alg string default_md Digest method or signature hash, usually one of openssl_get_md_methods[]
x509_extensions string x509_extensions Selects which extensions should be used when creating an x509 certificate
req_extensions string req_extensions Selects which extensions should be used when creating a CSR
private_key_bits int default_bits Specifies how many bits should be used to generate a private key
private_key_type int none Specifies the type of private key to create. This can be one of OPENSSL_KEYTYPE_DSA, OPENSSL_KEYTYPE_DH, OPENSSL_KEYTYPE_RSA or OPENSSL_KEYTYPE_EC. The default value is OPENSSL_KEYTYPE_RSA.
encrypt_key bool encrypt_key Should an exported key [with passphrase] be encrypted?
encrypt_key_cipher int none One of cipher constants.
curve_name string none One of openssl_get_curve_names[].
config string N/A Path to your own alternative openssl.conf file.
extra_attributes

extra_attributes is used to specify additional configuration options for the CSR. Both distinguished_names and extra_attributes are associative arrays whose keys are converted to OIDs and applied to the relevant part of the request.

Return Values

Returns the CSR or false on failure.

Changelog

VersionDescription
8.0.0 On success, this function returns an OpenSSLCertificateSigningRequest instance now; previously, a resource of type OpenSSL X.509 CSR was returned.
8.0.0 private_key accepts an OpenSSLAsymmetricKey instance now; previously, a resource of type OpenSSL key was accepted.
7.1.0 options now also supports curve_name.

Examples

Example #1 Creating a self-signed certificate

Example #2 Creating a self-signed ECC certificate [as of PHP 7.1.0]

See Also

  • openssl_csr_sign[] - Sign a CSR with another certificate [or itself] and generate a certificate

Anonymous

7 years ago

For those of you using Debian-based systems, the openssl configuration file is at: /etc/ssl/openssl.cnf

The_Lost_One

12 years ago

Not sure whether the "bug" [undocumented behavior] I encountered is common to other people, but this comment might save hours of painful debug:
If you can't generate a new private key using openssl_pkey_new[] or openssl_csr_new[], your script hangs during the call of these functions and in case you specified a "private_key_bits" parameter, ensure that you cast the variable to an int. Took me ages to notice that.

james at kirk dot com

7 years ago

When in doubt, read the source code to PHP!

$configargs is fairly opaque as to what is going on behind the scenes.  That is, until you actually look at php_openssl_parse_config[] in '/ext/openssl/openssl.c':

    SET_OPTIONAL_STRING_ARG["digest_alg", req->digest_name,
        CONF_get_string[req->req_config, req->section_name, "default_md"]];
    SET_OPTIONAL_STRING_ARG["x509_extensions", req->extensions_section,
        CONF_get_string[req->req_config, req->section_name, "x509_extensions"]];
    SET_OPTIONAL_STRING_ARG["req_extensions", req->request_extensions_section,
        CONF_get_string[req->req_config, req->section_name, "req_extensions"]];
    SET_OPTIONAL_LONG_ARG["private_key_bits", req->priv_key_bits,
        CONF_get_number[req->req_config, req->section_name, "default_bits"]];

    SET_OPTIONAL_LONG_ARG["private_key_type", req->priv_key_type, OPENSSL_KEYTYPE_DEFAULT];

Here we can see that SET_OPTIONAL_STRING_ARG[] is called for most inputs but for 'private_key_bits' SET_OPTIONAL_LONG_ARG[] is called.  Both calls are C macros that expand to code that enforces the expected input type.  The generated code ignores the input without warning/notice if an unexpected type is used and just uses the default from the configuration file.  This is why using a string with 'private_key_bits' will result in unexpected behavior.

Further inspection of the earlier initialization in the same function:

    SET_OPTIONAL_STRING_ARG["config", req->config_filename, default_ssl_conf_filename];
    SET_OPTIONAL_STRING_ARG["config_section_name", req->section_name, "req"];
    req->global_config = CONF_load[NULL, default_ssl_conf_filename, NULL];
    req->req_config = CONF_load[NULL, req->config_filename, NULL];

    if [req->req_config == NULL] {
        return FAILURE;
    }

And elsewhere in another function:

    /* default to 'openssl.cnf' if no environment variable is set */
    if [config_filename == NULL] {
        snprintf[default_ssl_conf_filename, sizeof[default_ssl_conf_filename], "%s/%s",
                X509_get_default_cert_area[],
                "openssl.cnf"];
    } else {
        strlcpy[default_ssl_conf_filename, config_filename, sizeof[default_ssl_conf_filename]];
    }

Reveals that 'config' in $configargs is an override for any default setting elsewhere.  This actually negates the comment in the documentation that says "Note: You need to have a valid openssl.cnf installed for this function to operate correctly. See the notes under the installation section for more information."  A more correct sentence would be "Note:  You need to either have a valid openssl.cnf set up or use $configargs to point at a valid openssl.cnf file for this function to operate correctly."

All of that goes to show that looking at the PHP source code is the only real way to figure out what is actually happening.  Doing so saves time and effort.

main ATT jokester DOTT fr

14 years ago

To set the "basicConstraints" to  "critical,CA:TRUE", you have to define configargs, but in the openssl_csr_sign[] function !

That's my example of code to sign a "child" certificate :

$CAcrt = "file://ca.crt";
$CAkey = array["file://ca.key", "myPassWord"];

$clientKeys = openssl_pkey_new[];
$dn = array[
    "countryName" => "FR",
    "stateOrProvinceName" => "Finistere",
    "localityName" => "Plouzane",
    "organizationName" => "Ecole Nationale d'Ingenieurs de Brest",
    "organizationalUnitName" => "Enib Students",
    "commonName" => "www.enib.fr",
    "emailAddress" => ""
];
$csr = openssl_csr_new[$dn, $clientPrivKey];

$configArgs = array["x509_extensions" => "v3_req"];
$cert = openssl_csr_sign[$csr, $CAcrt, $CAkey, 100, $configArgs];

openssl_x509_export_to_file[$cert, "childCert.crt"];

Then if you want to add some more options, you can edit the "/etc/ssl/openssl.cnf" ssl config' file [debian path], and add these after the [ v3_req ] tag.

alex at nodex dot co dot uk

7 years ago

In the PHP example above it uses "UK" as the country name which is incorrect, the country name must be "GB"

Richard Lynch

9 years ago

There appears to be no openssl_csr_free function.

At least not here.

If it's in the source, one might be able to just call it.

If it's not in the source, it probably should be.

Anonymous

17 years ago

If you get the error:

error:0D11A086:asn1 encoding routines:ASN1_mbstring_copy:string too short

then look at your key:value pairs in the $dn [distinguished name] array.

If you have one value [like "organizationalUnitName" = ""] set to an empty string, it will throw the above error.

Fix the error by either eliminating that array element from $dn completely, or using a space " " instead of an empty string.

robertliu AT wiscore DOT com

17 years ago

I am using PHP-4.3.11.
The type of configargs--private_key_bits is a INTEGER, not a string.
An example of configration:

dankybastard at hotmail

17 years ago

As you probably guessed from the example, the documentation is misinforming.  openssl_csr_new returns a CSR resource or FALSE on failure.

mixed openssl_csr_new [assoc_array dn, resource_privkey, [...]]

@operator

5 years ago

One command to create modern certificate request with 4 SAN subdomain.
According to RFC you can change CN [common name] and subjectAltName. When cert validated searching in CN and subjectAltName.

openssl req -new -nodes -config

Chủ Đề