切換 Sun JDK 為 openJDK

OpenJDK和Sun的JDK Linux版是不同的。前者為開源軟體,後者則為商業軟體。

 

Q: How to download and install prebuilt OpenJDK packages

A: 先下載好特定平台的壓縮檔,再解開來就可以直接使用:

OpenJDK 下載網址:
http://jdk.java.net/9/

解壓縮用指令:

$ tar xvf openjdk-9.*_bin.tar.gz

Max是用 maxOS 開發,所以是在 /Library/Java/JavaVirtualMachines 這個目錄下執行指令:

sudo tar xvf ~/Downloads/openjdk-9.0.4_osx-x64_bin.tar.gz

Q: How to remove Java 8 JDK from Mac

A:

Run this command to just remove the JDK

sudo rm -rf /Library/Java/JavaVirtualMachines/jdk<version>.jdk

Run these commands if you want to remove plugins

sudo rm -rf /Library/PreferencePanes/JavaControlPanel.prefPane
sudo rm -rf /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin
sudo rm -rf /Library/LaunchAgents/com.oracle.java.Java-Updater.plist
sudo rm -rf /Library/PrivilegedHelperTools/com.oracle.java.JavaUpdateHelper
sudo rm -rf /Library/LaunchDaemons/com.oracle.java.Helper-Tool.plist
sudo rm -rf /Library/Preferences/com.oracle.java.Helper-Tool.plist

移掉 Sun JDK 之後,再去 run tomcat 就會顯示錯誤訊息:

The archive: /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/lib/tools.jar which is referenced by the classpath, does not exist.

解法,要刪掉舊的 TimCat Server 重新增加 Web Server, 並指定 JRE 為 openJDK 的版本即可。

附註:如果有修改 server.xml, web.xml, catelina.policy 等檔案,記得要先備份。


接著 build 會出問題:

javax.activation classes throws NoClassDefFoundError
https://bugs.openjdk.java.net/browse/JDK-8187748?jql=project%20in%20(JDK)%20AND%20component%20in%20(core-libs)%20AND%20Subcomponent%20in%20(javax.activation)

原來不只我才遇到,結論:

千萬不要用「太新」的版本!stable 最重要!

遇到這個問題 2個解法,1是加參數去 build, 我選擇方法 2降版為 JDK 8 版,改用 openJDK 8 的下載網址:
http://jdk.java.net/8/

附註:macOS 下載 .dmg 檔案,點 2下就安裝好了。

JDK 8

Debian, Ubuntu, etc.

On the command line, type:

$ sudo apt-get install openjdk-8-jdk

很多情況不會在 server 上開發,所以安裝 jre 即可

$ sudo apt-get install openjdk-8-jre

 

Fedora, Oracle Linux, CentOS, Red Hat Enterprise Linux, etc.

On the command line, type:

$ sudo yum install java-1.8.0-openjdk

安裝完後, jre 目錄會在:

/usr/lib/jvm/jre/bin/ 之下

如果需要設定或存取,可以在這folder 下拿到 binary.

 

 

Apache 的SSL憑證 安裝與更新 – CentOS

以 TWCA 為例來作為說明,送出憑證申請檔 CSR 後你會得到 根憑證主機憑證「root.cer」、網域憑證「server.cer」、中繼憑證1「uca_1.cer」、中繼憑證1「uca_2.cer」

 

********************************************

Apache 安裝 SSL 憑證

在 /etc/httpd/conf/httpd.conf 裡要設定
Include conf.d/*.conf
這樣 httpd 才會去讀取 conf.d 裡所有的 conf 檔

在 /etc/httpd/conf.d 目錄下,建立一個 ssl.conf 預設應該會有,然後修改底下幾個項目

# 指定 x509 憑證的副檔名 crt

AddType application/x-x509-ca-cert .crt

# 指向你剛剛用 openssl 所產出來主機金鑰 KEY

SSLCertificateKeyFile /etc/ssl/private/server.key

# 指向剛剛從憑證中心取得的 網域憑證,網域憑證只需要複製到你指定的路徑即可。

SSLCertificateFile /etc/ssl/certs/server.crt

# 憑證鍊

SSLCertificateChainFile /etc/ssl/certs/uca.crt

憑證鍊就比較麻煩,因為中繼憑證可能為一層,也可能為兩層,如果從 TWCA 拿到的是兩層的中繼憑證,你可以把 uca_1.cer 跟 uca_2.cer 作合併存為 uca.crt ,uca_2.cer 在上面。

cp uca_2.cer uca.crt 
cat uca_1.cer >> uca.crt

接著把 apache httpd 的服務重啟 sudo /etc/init.d/httpd restart 就可以啟用新的憑證了。

tornado TLSV1_ALERT_UNKNOWN_CA

我在自己的 NB 裡同時架了 2個 web server, 使用 2個自己sign 的 ssl 憑證。使用行動裝置(iPad)先存取第1台 用 TimCat 架的 web server之後,再連到同一個 ip address 下的 tornado web server 會顯示錯誤訊息:

[W 170906 08:19:15 iostream:1327] SSL Error on 9 ('192.168.1.55', 62014): [SSL: TLSV1_ALERT_UNKNOWN_CA] tlsv1 alert unknown ca (_ssl.c:661)

而且是無窮迴圈, client side 會一直 retry…,大約每1秒可以呼叫到 8個 request。

解法當然就是 web server 分在不同台就好了…


我是透過下面的指令來建立自有憑證:

I created SSL certificates using these steps:

Create the CA private key:

openssl genrsa -des3 -out servercakey.pem 

Create the CA public certificate (When you create a certificate, there must be one unique name (a Distinguished Name (DN)), which is different for each certificate that you create):

openssl req -new -x509 -key servercakey.pem -out root.crt 

Create the server’s private key file:

openssl genrsa -out server.key 

Create the server certificate request:

openssl req -new -out reqout.txt -key server.key 

Use the CA private key file to sign the server’s certificate:

openssl x509 -req -in reqout.txt -days 3650 -sha1 -CAcreateserial -CA root.crt -CAkey servercakey.pem -out server.crt 

Create the client’s private key file:

openssl genrsa -out client.key 

Create the client certificate request:

openssl req -new -out reqout.txt -key client.key 

Use the CA private key file to sign the client’s certificate:

openssl x509 -req -in reqout.txt -days 3650 -sha1 -CAcreateserial -CA root.crt -CAkey servercakey.pem -out client.crt 

Creating pem file for Server:

cat server.crt root.crt > server.pem

上面很多指令是多餘的,產生的檔案也都沒有使用到,tornado 只使用到 2個:

 server_https = HTTPServer(self.app, xheaders=True, ssl_options = {
 "certfile": os.path.join(options.certificate_path, "server.crt"),
 "keyfile": os.path.join(options.certificate_path, "server.key"),
 })

 

Java 與 Tomcat 搭配的加密連線:HTTPS 雙向認證

今天遇到的任務是要讓Tomcat 7 支援ssl, schema 從 http 改走 https.

 

Step 1: 為伺服器產生簽章庫

keytool -genkey -v -alias tomcat -keyalg RSA -validity 10000 -keystore ./tomcat.keystore -dname "CN=localhost,OU=my,O=my,L=Taipei,ST=Taiwan,c=TW" -storepass changeit -keypass changeit

執行完會多一個檔案。

 

Step 2:修改 Tomcat 目錄下的 conf/server.xml:

找到 <Connector port=”8443″ … 這部份的設定應該是被註解掉了,把註解拿掉! 並且加上 keystoreFile 及 keystorePass 兩個屬性,內容值當然就依第一步驟產生的填入。

<Connector port=”8443″ protocol=”org.apache.coyote.http11.Http11Protocol”

               maxThreads=”150″ SSLEnabled=”true” scheme=”https” secure=”true”

keystoreFile=“/Users/max/Documents/settings/tomcat.keystore” keystorePass=“changeit” keyAlias=“tomcat”

               clientAuth=”false” sslProtocol=”TLS” />


醬子就完成了,耶真的連上去了。

 

我之前試了其他篇文章,發現 keystorePass=“changeit” 的密碼不知道該用 -keypass 還是用 storepass,所以最佳解法就是這2組pass 都設成一樣的,不然會出現下面的Error.

SEVERE: Failed to initialize end point associated with ProtocolHandler ["http-bio-8443"]
java.io.IOException: Cannot recover key