แสดงบทความที่มีป้ายกำกับ SSL แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ SSL แสดงบทความทั้งหมด

วันอังคารที่ 22 มิถุนายน พ.ศ. 2553

Apache + SSL ตอนที่ 2 สร้าง Cert และ Config Apache

** ต้องผ่านตอนที่ 1 มาก่อนนะครับ ถ้ายังไม่ผ่านตอนที่ 1 ให้กลับไปตรวจสอบจนครบก่อนค่อยมา **

ขั้นตอนการสร้าง SSL request

# cd ~root/sslCA
# openssl req -new -nodes \
-out jjthai-req.pem \
-keyout private/jjthai-key.pem \
-config /etc/ssl/openssl.cnf

จะได้ผลลัพธ์ประมาณนี้ (ในช่วงท้ายจะมีการ ถาม challenge password ให้ เคาะ enter ผ่านเลย - คือไม่มี password เพราะ ถ้าใส่ challenge password ทุกครั้งที่ start apache มันจะขึ้น prompt เพื่อถาม password)

-------------------------------------------------
Generating a 1024 bit RSA private key
.............................++++++
.............................++++++
writing new private key to 'private/jjthai-key.pem'
-----
You are about to be asked to enter information that
will be incorporated
into your certificate request.
What you are about to enter is what is called a
Distinguished Name or a DN.
There are quite a few fields but you can leave
some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [TH]:
State or Province Name (full name) [NE]:
Locality Name (eg, city) [JJthai]:
Organization Name (eg, company) []: JJthai
Organizational Unit Name (eg, section) []: Development
Common Name (eg, YOUR name) []: JJthai
Email Address []: support@jjthai.net

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
-------------------------------------------------

ขั้นตอนการสร้าง SSL Certificate

# openssl ca
-config /etc/ssl/openssl.cnf
-out jjthai-cert.pem \
-infiles jjthai-req.pem

มันจะถาม password ของ CA (ที่บอกให้จำ password ในตอนที่ 1)

-------------------------------------------------
Using configuration from /etc/ssl/openssl.cnf
Enter pass phrase for /root/sslCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 4096 (0x1000)
Validity
Not Before: Aug 5 02:51:42 2006 GMT
Not After : Aug 2 02:51:42 2007 GMT
Subject:
countryName = TH
stateOrProvinceName = NE
organizationName = JJthai
commonName = JJthai
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
8B:48:A5:3A:C7:EA:9A:B3:61:9F:AC:B9
X509v3 Authority Key Identifier:
keyid:F8:D3:77:0C:78:6D:87:20:00:BF
DirName:/C=TH/ST=NE/L=JJthai
/O=JJthai
/CN=JJthai
serial:E5:A5:39:3F:6E:63:FA:7E

Certificate is to be certified until
Aug 2 02:51:42 2007 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
-------------------------------------------------

สร้างไดเรคทอรี่เพื่อเก็บ Certificate

# mkdir /etc/ssl/crt
# mkdir /etc/ssl/key

# cp ~/sslCA/jjthai-cert.pem /etc/ssl/crt
# cp ~/sslCA/private/jjthai-key.pem /etc/ssl/key

กำหนดค่า Apache 2.2 ให้ใช้งาน SSL

ในไฟล์ httpd.conf ด้านล่างๆ มันจะ มี comment ในการ include ไฟล์ ไว้ ให้มองหาบรรทัดนี้แล้วเอา comment ออก (ไดเรคทอรี่อาจจะมีไม่ตรงกันบ้างขึ้นอยู่กับวิธีการติดตั้ง Apache ของแต่ละคน)

# Secure (SSL/TLS) connections
Include etc/apache22/extra/httpd-ssl.conf

จากนั้นก็เข้าไปแก้ไขไฟล์ /usr/local/etc/apache22/extra/httpd-ssl.conf concept หลักๆ ก็คือ ตัวเข้มที่ต้องชี้ ตำแหน่ง cert, key ให้ถูกต้อง

SSLCertificateFile /etc/ssl/crt/jjthai-cert.pem
SSLCertificateKeyFile /etc/ssl/key/jjthai-key.pem


หากในเครื่องมีหลายเว็บ แล้วแต่ละเว็บก็ต้องใช้ SSL คนละอันก็ต้องกำหนดค่า ของ แต่ละ virtualhost ให้ถูกแค่นั้นเอง ข้างล่างนี้เป็นตัวอย่าง (ยังไม่ได้ทดลองนะครับ อาจจะ work หรือ ไม่ work ก็ต้องไปลองแก้กันดู)

-------------------------------------------------

ServerName ssl.jjthai.net
SSLEngine on
SSLCertificateFile /etc/ssl/crt/jjthai-cert.pem
SSLCertificateKeyFile /etc/ssl/key/jjthai-key.pem

DocumentRoot /usr/local/www/apache22/data
CustomLog /usr/local/www/logs/ssl-access_log combined
ErrorLog /usr/local/www/logs/ssl-error_log

-------------------------------------------------

จากนั้นให้ รีสตาร์ท apache service แล้วลอง ใช้ browser เรียก https:// เพื่อทดสอบ จะต้องใช้งานได้ ถ้าไม่ได้ แต่ทำตามขั้นตอนข้างบนทุกอย่างแล้ว ก็อาจจะเป็นที่ Firewall ที่ปิดพอร์ต หรือไม่ก็ Browser ที่ block certificate อยู่ แค่นั้นเอง

Apache + SSL ตอนที่ 1 ตั้งตัวเองเป็น CA

มีหลายๆครั้งที่ การใช้งานเว็บเซิฟเวอร์ก็ต้องการในส่วนของ SSL (Secure Socket Layer) ซึ่งใน การตั้งเซิฟเวอร์ production จริงๆ ก็จะใช้วิธีการ ซื้อ Cert มาจาก CA แล้วนำมาคอนฟิก ทีนี้แล้วถ้าเราจะทำการทดสอบเฉยๆ หรือ เป็นการใช้งานภายในองค์กร (ซึ่งอาจจะไม่ได้ใช้ IP จริง และ ไม่ได้เชื่อมต่ออินเตอร์เน็ต) จะทำยังไงหล่ะทีนี้ ?

หากว่าคุณซื้อไม่ได้ก็ไม่ต้องซื้อครับ ตั้งตัวเองเป็น CA ขึ้นมาเลย (บทความนี้ Assume ว่าคุณติดตั้ง FreeBSD + Apache 2.2 + openssl เรียบร้อยแล้วนะครับ)

ขั้นตอนแรก แก้ไขไฟล์ /etc/ssl/openssl.cnf ให้แก้อยู่ 2 ตำแหน่งคือ ตำแหน่งที่เก็บ Signature ต่างๆ และ วันหมดอายุของ Cert (อย่าลืมสร้างไดเรคทอรี่ /root/sslCA)

# vi /etc/ssl/openssl.cnf

-------------------------------------------
dir = /root/sslCA
default_days = 3650
-------------------------------------------

และถ้าคุณต้องการสร้าง Cert เยอะ ให้หลายๆเซิฟเวอร์ คุณอาจจะแก้ไขไฟล์ /etc/ssl/openssl.cnf ในส่วนของค่า Default อื่นๆได้เช่น

contryName_default = TH
stateOrProvinceName_default = NE
localityName_default = JJthai

ขั้นตอนต่อไปก็คือการสร้างไดเรคทอรี่ที่จำเป็น เพื่อเป็นการประหยัดเวลา และ เพื่อความเข้าใจที่ตรงกัน ก็ให้เซฟ shell script ข้างล่างนี้ไปรัน

createCA.sh

-------------------------------------------
#!/bin/sh
##############################################
# CA Creator
# http://www.freebsdmadeeasy.com/
#
# This Script creates a certificate of authority
# using OpenSSL. It was written and tested on
# FreeBSD 6.1-RELEASE Use at your own risk
#
#
##############################################


echo "Setting up the directories"
mkdir ~/sslCA
echo "sslCA"
mkdir ~/sslCA/certs
echo "sslCA/certs"
mkdir ~/sslCA/private
echo "sslCA/private"
mkdir ~/sslCA/newcerts
echo "sslCA/newcerts"

cd ~/sslCA
echo 1000 > serial
touch index.txt

echo "Setting the permission to 700 on sslCA"
chmod -R 700 ~/sslCA

echo "Creating the CA"
echo "Use a strong password and keep it safe!"
openssl req -new -x509 -days 3650 -extensions v3_ca -keyout private/cakey.pem -out cacert.pem -config /etc/ssl/openssl.cnf

more ~/sslCA/cacert.pem
more ~/sslCA/private/cakey.pem

echo "sslCA/cacert.pem"
echo "sslCA/private/cakey.pem"

echo "All Done!"
-------------------------------------------

เพื่อความปลอดภัย เมื่อรัน script เสร็จ ให้ เปลี่ยนสิทธิ์ในการเข้าถึง เป็น 700 ด้วย (ให้ root เข้าได้คนเดียว)

# cd /root
# chmod 700 sslCA

ถัดไปเป็นคำสั่ง ตั้งตัวเองเป็น CA

# cd ~root/sslCA
# openssl req -new -x509 -days 3650 -extensions v3_ca \
-keyout private/cakey.pem \
-out cacert.pem -config /etc/ssl/openssl.cnf

ผลลัพธ์ที่ได้จะออกมาเป็นประมาณนี้ (มีอยู่ช่วงนึงต้องใส่ password ห้ามลืม password อันนี้นะ เพราะมันคือ password ของ ca)

-------------------------------------------
Generating a 1024 bit RSA private key
...................++++++
.....................++++++
writing new private key to 'private/cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that
will be incorporated
into your certificate request.
What you are about to enter is what is called a
Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [TH]:
State or Province Name (full name) [NE]:
Locality Name (eg, city) [JJthai]:
Organization Name (eg, company) []: JJthai
Organizational Unit Name (eg, section) []: Developemnt
Common Name (eg, YOUR name) []: JJthai
Email Address []: support@jjthai.net
-------------------------------------------

เมื่อเสร็จเรียบร้อย สิ่งที่ควรจะได้ก็คือ 2 ไฟล์นี้

/root/sslCA/cacert.pem
/root/sslCA/private/cakey.pem

เท่านี้ก็ให้ไปอ่าน ตอนที่ 2 ซึ่งเป็นการ Gen Cert และตั้งค่า Apache + SSL ได้แล้ว