VPS上のNginxサーバーにGeoTrustのQuickSSL Premiumを設定する方法

blog-img

概要

VPS上で動くNginxサーバーにGeoTrustのQuickSSL Premiumを設定する。
試験環境ではVPSにCentOSを利用。
GeoTrustのQuickSSL Premiumは日本ではなくアメリカのサイトから購入。(1年149ドル)

SSL導入の流れ

  1. [VPSサーバー] サーバーで秘密鍵を生成する
  2. [VPSサーバー] 秘密鍵を使って、Geotrustに申請するためのCSRファイルを作成する
  3. [WEB] GeoTrustにQuickSSL Premiumを申請
  4. [WEB] 申請完了後、中間証明書とサーバ証明書を取得
  5. [VPSサーバー] GeoTrust中間証明書とサーバ証明書をつなぎあわせて1つのファイルにする
  6. [VPSサーバー] 秘密鍵とつなぎあわせた証明書をnginx.confに読み込ませる
  7. [VPSサーバー] Nginxサーバーをリスタート (iptablesを使っている場合は443ポートをAccept)
  8. [WEB] httpsでアクセスしてエラーが出ていないかチェック

1. サーバー用秘密鍵・証明書の作成

# cd /etc/pki/tls/certs/
# sed -i 's/365/3650/g' Makefile
# make mydomain.com.crt
umask 77 ; \
        /usr/bin/openssl genrsa -aes128 2048 > mydomain.com.key
Generating RSA private key, 2048 bit long modulus
...........................................+++
................................................+++
e is 65537 (0x10001)
Enter pass phrase: ⇐ 任意のパスワード
Verifying - Enter pass phrase: ⇐ 任意のパスワードを再度入力
umask 77 ; \
        /usr/bin/openssl req -utf8 -new -key mydomain.com.key -x509 -days 3650 -out mydomain.com.crt -set_serial 0
Enter pass phrase for mydomain.com.key: ⇐ 任意のパスワードを再度入力
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) [XX]:JP ⇐ 国名
State or Province Name (full name) []:Nagano ⇐ 件名
Locality Name (eg, city) [Default City]:Nagano ⇐ 市区町村
Organization Name (eg, company) [Default Company Ltd]:mydomain.com ⇐ 会社名(なんでも可)
Organizational Unit Name (eg, section) []: ⇐ 空
Common Name (eg, your name or your server's hostname) []:www.mydomain.com ⇐ SSL対応させるドメイン
Email Address []:webmaster.mydomain.com ⇐ 管理者メールアドレス

 2. 秘密鍵を使って、Geotrustに申請するためのCSRファイルを作成する

上記の操作でmydomain.com.keyというファイルが同階層に出来たので以下のコマンドを使ってサーバー用秘密鍵からパスワードを除去

# openssl rsa -in server.key -out server.key

次に、以下のコマンドを使ってCSRファイルを作成

># openssl req -new -key mydomain.com.key -out mydomain.com.csr

 3. GeoTrustにQuickSSL Premiumを申請

今回は、日本のGeoTrustではなく米国のGeoTrustから購入 → http://www.geotrust.com/ssl/ssl-certificates-premium/

幸い、申請サイトは日本語にも対応しています。

Step1) SSLの有効期限を指定

 QuickSSL Premium01

 

Step2) 管理者、技術者の情報を入力

QuickSSL Premium02

 

Step3) CSRデータを貼り付け

QuickSSL Premium03

 

Step4) ドメイン名が合っているか確認

QuickSSL Premium04

 

Step5) CSR情報が合っているか確認

QuickSSL Premium05

 

Step6) 証明書の情報を受信できる生きているEmailアドレスを選択する必要があります

QuickSSL Premium06

 

Step7) 支払情報を入力

QuickSSL Premium07

 

Step 8) 認証のために電話番号を登録して、自動ガイダンスの電話が掛かってくるのを待ちます。

自動ガイダンスが流れたら、画面下に表示されている番号を入力して#を押します。

認証に成功すると自動で画面が次に遷移します。

Step9) 申請完了です。

4.申請完了後、中間証明書とサーバ証明書を取得

送られてくるメールから、以下のページにたどり着くことができます。

QuickSSL Premium08

 

このUser Portal という画面の左メニューから「View Certificate Information」を選択します。

そして、以下の画面からGetTrust中間証明書とサーバ証明書を取得します。

・上のDownloadボタン(もしくはShow Certificateリンク)からサーバー証明書情報を取得します。
※フォーマットはX.509 Certificateで問題ありません
※ファイル名を mydomain.com.crt とします。

・下のDownloadボタン(もしくはShow Certificateリンク)からGetTrust中間証明書情報を取得します。
※フォーマットはApache Bundleで問題ありません
※ファイル名を geotrust.crt とします。

QuickSSL Premium09

 

5. GeoTrust中間証明書とサーバ証明書をつなぎあわせて1つのファイルにする

自分の場合は、上記の2ファイルを /etc/ssl/certs/ に置きました。
次に、catコマンドで2つのファイルを1つにします。

#cat mydomain.com.crt geotrust.crt > mydomain.com.chained.crt

 6. 秘密鍵とつなぎあわせた証明書をnginx.confに読み込ませる

/etc/nginx/nginx.conf を編集します。

server {
 listen 80;
 listen 443 ssl;
 # 秘密鍵 (cert. key)
 ssl_certificate_key /etc/pki/tls/certs/mydomain.com.key;
 # 合体証明書
 ssl_certificate /etc/ssl/certs/mydomain.com.chained.crt;
 //以下略

7. Nginxサーバーをリスタート (iptablesを使っている場合は443ポートをAccept)

# /etc/rc.d/init.d/nginx restart

 8. httpsでアクセスしてエラーが出ていないかチェック

ブラウザでサイトチェックして、鍵のマークが正常に表示されていたら成功です。

鍵が外れているようなアイコンが出る場合はHTTP通信を行っている可能性が高いので、ソースコードを見直します。


XPagesDay 講師として参加します

XPagesDay 2013

XPagesのためのコミュニティイベント「XPagesDay」が今年も開催されます。

去年は1日だけだったのが、今年はウェブセッションを含めて3日間に大幅拡大!

開催は2013年11月6,7,8日の3日間

日本のIBMチャンピオンの方々、XPagesをよく知るコミュニティの方々が講師陣を務めて、今年もXPagesを使った様々なセッションが催されます。

専用HPからセッションのお申込みが行えます。こちら→http://xpagesday.com/xpagesday.nsf/home.xsp

 

そんなXPagesのお祭りイベントに、なんと私も講師として参戦させていただくことになりました!!

自分のセッションは11月8日 14:00から行われる

「【C-3】ジャンボフェリー 予約システムの事例からみるXPagesを使った提案・開発の概要」

こちらのセッション、クロージングセッションにも使われるコムチュア株式会社様の会議室をお借りした会場でのセッションです。

(想像すると、今から既に緊張しています)

なお、こちらが自分のセッションの概要、

[blockquote]Notes/Dominoは社内向けのグループウェアであるという常識を打ち壊します!
実際に一般利用者向けに稼働しているジャンボフェリー 株式会社様の予約システムの導入事例を元に、提案、開発の手法を開発者自らご紹介します。

全くNotes/Dominoを知らないお客様に、どのようにXPagesを使ったWEBアプリケーションを提案していったのか。
一般向けのWEBアプリケーションでよく見る「アカウントの自動登録」や「ポップアップ式のログインフォーム」、「ショッピングカートのようなページをまたいだ予約」、「リアルタイムな予約状況の確認」などをXPagesでどのように実装していったのかを易しく解説していきます。

 田付 和慶 (KTrick合同会社)[/blockquote]

その他のセッションなど詳細情報はこちらのページまで → http://xpagesday.com/xpagesday.nsf/sessions.xsp

自分のセッションでは、XPagesを使えばこんな新しいシステムが出来てしまう、ということを少しでもお伝え出来たらと思っています。

世間では様々なRAD 【 Rapid Application Development 】 な環境が整ってきていて、個人的に好きなCakePHPもそうですが、そんな流行りのフレームワークにも負けないXPagesの優位性や拡張性を解説していく予定です。

このセッションの後に少しでも多くの方が、XPagesを使ってなにかアプリケーションを作ってみたいと思ってもらえるように頑張ります。

またシステム開発の打合せの場面で、XPagesを使った提案が少しでも増えるようになるといいですね。

 


ポータルサイト 「エグゼノスフィア」



ポータルサイト作成、構築ならXenoSphere

地域情報ポータルサイト、店舗検索サイトのシステムパッケージです。
「自分の住む街のレストラン検索サイトを作りたいけど、どうやって始めればいいのかわからない。」
「自分にはアイデアがあるけど、ポータルシステムを依頼したら数百万円の見積もりを出された。」
「自分には営業力があるから、今すぐにでも店舗検索サイトを始めて顧客を集めたい!」

「XenoSphere」はそんな方のため、
グルメ検索、不動産物件検索、美容院検索など業種を問わず、お客様のニーズに合わせてご提供し、ビジネスを強力にサポート致します。
また、長年のさまざまなサイト構築・運用の知識・ノウハウを基につくられた「XenoSphere」はデザイン性、ユーザビリティ、SEO対策がしっかり組み込まれた安心・丁寧なシステムです。

システム側の運用、バックアップは当社にお任せください。
システムの難しいことや、細かなデザインなどは当社できっちりサポート!あなたはすぐにでも自分のビジネスに専念して頂けます。





ホームページ制作についてのお問合せ


ケートリック 始動開始

ケートリックの ウェブサイトを作成中です。

XPagesを使ったアプリケーション情報や、IBM Connectionsなどのカスタマイズ情報など盛りだくさんで作成予定です。


CakePHP Shells内でAuth Componentを使ってUserを追加

前回のブログでCakePHP Shellを作成しましたが、そのシェルの中でAuth Componentを利用する際にはまったので書いて見ます。

ご存知、Componentを読み込む場合はコントローラーのメンバ変数として

	var $components = array('Auth');

のように書くだけですが、Shellの場合はこうやってもComponentを読み込んでくれません。

Shellでコンポーネントを利用する場合は以下のように関数内で呼び出してやることで解決できました。

function main(){
    App::import('Component','Auth'); 
    $this->Auth = new AuthComponent(null); 

}

さて、なぜAuth ComponentをShell内で使いたかったかというと、自分の場合、Auth->password() 関数を利用してパスワードをハッシュさせた後、ユーザーを追加したかったからです。

以下、Shell内でのユーザー作成に使ったコードです。

$username = [NEW_USERNAME];
$password = $this->Auth->password([NEW_PASSWORD]);

$retData = $this->User->findByUsername($username);
if(empty($retData['User']) ){
    $data = array("User" => array(
                           "username" => $username,
                           "password" => $password,
                           )
                       );
    $this->User->save($data);
}

最後に、以下参考になったサイトです。

Cookbook 認証 - http://book.cakephp.org/ja/view/172/%E8%AA%8D%E8%A8%BC

CakePHP: Creating a Custom Shell for Adding Users for Use With AuthComponent - http://www.springenwerk.com/2008/07/cakephp-creating-custom-shell-for.html


CakePHP Shellsを使ってスクリプトをDreamhost上のCron Jobsで動かす方法

今回は、CakePHPを使って自作プログラムをCron Jobで動かす方法について書きます。 今回はサーバーにDreamhostを使ったのでDreamhostでCron Jobを動かす特有の方法も説明していきます。

まず、CakePHPでコマンドラインスクリプトを書く必要がありますが、CakePHPではShellという機能を使って簡単に実現することができます。

作成手順はCakePHPのリファレンス Cookbook (http://book.cakephp.org/#!/view/1106/The-CakePHP-Console) にある通りです。

まず最初にShellクラスを継承したクラスファイルを自分のAppフォルダの中 (CAKEPHP/myapp/vendors/shells/)の中に作成します。
自分はTwitter.phpというクラスファイルを作成、以下のようにつくりました。

class TwitterShell extends Shell {

  function main() {
      $this->out("TEST Task Run! n");

  }

}

これだけです。超シンプル!

では早速これをまずマニュアルで実行してみます。

SSHでDreamhostにログイン後、以下のようにコマンドを実行します。

/home/YOUR_ACCOUNT/DOMAIN.COM/cake/console/cake -app /home/YOUR_ACCOUNT/DOMAIN.COM/myapp/ twitter

ここで -appパラメータを使ってフルパスで自分のアプリケーションフォルダ(この場合myapp)をしてやらないと、CakePHPは常にappフォルダをみに行ってしまいます。

上手くいけば、

Welcome to CakePHP v1.3.7 Console
---------------------------------------------------------------
App : myapp
Path: /home/YOUR_ACCOUNT/DOMAIN.COM/myapp
---------------------------------------------------------------
TEST Task Run!

のように表示されます。

プログラムが正常に動くことを確認出来たので、次にDreamhostからCronjobに登録します。

Dreamhostのコントロールパネルにログイン後、「Goodies」の中の「Cron Jobs」を選択します。

「Add New Cron Job」ボタンをクリックしてCommand to runフィールドに先ほどの

/home/YOUR_ACCOUNT/DOMAIN.COM/cake/console/cake -app /home/YOUR_ACCOUNT/DOMAIN.COM/myapp/ twitter

を入力します。

最初は実行確認のために、Email output toフィールドにEmailを記入しておくことをお薦めします。

Cron Jobエントリーを保存して後は実行されるのを待つばかり、、、と思いきや、残念ながらDreamhostではさらにすこしばかり変更を加えてやらないと上手くスクリプトが走りません。

実際、問題は実行結果をEmailで受け取るとわかるのですが、

/home/YOUR_ACCOUNT/DOMAIN.COM/cake/console/cake: line 24: exec: php: not found

のようにエラーが帰ってきてしまいます。

これは/cake/console/cakeファイルがphpコマンドを実行できないというエラーなので、Dreamhost用にcakeファイルを以下のように書き換えてやる必要があります。

まず、一行目の

LIB=${0/%cake/}
APP='pwd'

の下に

TERM=linux
export TERM

を追加しておきます。これは必須ではないようですが、追加しておくことでサーバーメンテナンス等でエラーが起きたときに助けになるようです。

次に

exec php -q ${LIB}cake.php -working "${APP}" "$@"

のラインを

exec /usr/local/php5/bin/php -q ${LIB}cake.php -working "${APP}" "$@"

のように書き換えます。 これはphp5コマンドを明示的に呼び出しています。

以上で、Cron Jobのスクリプトが正常に実行されました。

余談ですが、DreamhostのCron Jobは最短で10分間隔でしか実行できないみたいです。 何個もCron Jobを登録したらもっと短い間隔で実行できるかもしれませんが、試してません。

これで、自分は今流行(?)のOAuthを使ったTwitter BOTの作成をしてみたのですが、それはまた次回のブログで説明するようにします。

最後に、

参考になったサイト

CakePHP Shells, and Cron Jobs -  http://www.utoxin.name/2009/07/cakephp-shells-and-cron-jobs/

Running a cakePHP shell script as cronjob on Dreamhost - http://www.pixelastic.com/blog/242:running-cakephp-shell-script-cronjob-dreamhost

Setting up cron jobs with Cake shells - http://planetcakephp.org/aggregator/items/4632-setting-up-cron-jobs-with-cake-shells


Magentoの管理画面の日本語化

Magentoの管理画面の日本語化の方法です。

今回のMagentoのVersionは1.4.2.0です。

Step 1.  日本語化ファイルを以下のURLからダウンロード。

https://github.com/rack990/Magento-Japanese-Translation

Step 2.  解凍した中にあるフォルダ[ja_JP]を"/app/locale"にアップロード。

Step 3.  [System] → [Cache Management]から[Flush Magento Cache]ボタンをクリック

Step 4. 管理画面のページの下の[interface Locale]ドロップダウンから[日本語]を選択。


[CakePHP] JSON出力時にstring型をint型に戻す

久々のブログ、今回はCakePHPでJSON出力をするときにInteger型、String型に型変換して出力する方法について書きます。 (あ、今回も他力本願、満載)

まず、CakePHPでJSON出力をする為には

Controllerで

$yourJsonObect= $this->YourModel->find('all');
$this->set('yourJsonObect', $yourJsonObect);

としてやり

Viewで

<?php echo $javascript->object($yourJsonObect); ?>

としてやれば簡単に実現できます。

出力されるコードは以下のようになります。

[{"YourModel":{"id":"10060","foreign_id":"1","short_description":"Short Desc Test.","long_description":"Long Desc Test"},
{}
.....
)]

これで、殆ど場合は問題ないのですが、データベース上でIntegerで持っているスキーマ(id, foreign_idなど)も全てString型として出力されます。

もし、JSONデータを受け取る側が厳密にInteger型、String型を区別して受け取りたい場合などに以下の方法でスマートに解決できたので紹介します。

余談ですが、自分の場合は、iPhone開発において、JSONデータをウェブサーバーから受け取り、Core DataにInsertする時に、iPhone側で型チェックや型変換をさせたくなかったので、サーバー側で吸収してしまおうという経緯がありました。

参考にしたサイトはこちらです。

CakePHPのmodelの結果配列でstring型をint型に戻す。

CakePHPでmodel::findなどの関数で結果配列を取得したときに、データベースではint型の値string型として返って来ます。

今回は、flashにjson出力でデータを渡したかったので、別に文字列型のまま渡しても問題ないのかもしれないけど、なんか気持ち悪い。

それに例えばよくある、intの0,1をフラグと扱って if (flag) {.... }なんて書いたらマズいんじゃないかと思うので、settypeで型変換を行う方法。

引用元: CakePHPのmodelの結果配列でstring型をint型に戻す。: ろーにーの日記.

モデルの親クラスで、Findで取得したデータ(デフォルトは全てString)をデータベースのTypeを参照して、型変換を行っています。

app_model.phpにafterFind()オーバーライド関数を追加してやるだけ。

class AppModel extends Model{
	public function afterFind($results, $primary = false) {
		parent::afterFind($results, $primary);
		$columnTypes = $this->getColumnTypes();
		foreach($results as $index => $result) {
			foreach($columnTypes as $field => $columnType) {
				if($columnType == 'integer') {
					if(isset($results[$index][$this->name][$field])) {
						settype($results[$index][$this->name][$field], 'integer');
					}
				}
			}
		}
		return $results;
	}
}

これで全てのモデルが自動変換されるようになりました。 感激~

変換後のJSON出力を見ると以下のようになります。

[{"YourModel":{"id":10060,"foreign_id":1,"short_description":"Short Desc Test.","long_description":"Long Desc Test"},
{}
.....
)]

Integer型の数字の部分からダブルクォーテーションが消えました。

めでたしめでたし。

http://app.cocolog-nifty.com/t/trackback/120702/48427427

Notes Form内のComboboxでキーワード変更してもOnChangeイベントがトリガーされない

表題の通りなのですが、Domino DesignerでForm内にComboboxフィールドを作成時にキーワード変更してもOnChangeイベントが思い通りにトリガーされない時の対処方法です。

厳密には、キーワード変更後、マウスが別の場所にフォーカスしてから、OnChange()やExiting() イベントが呼ばれるためイベント呼ばれるのが遅いと感じてしまいます。

これに対応するには、フィールドプロパティのアドバンスド オプションタブの一番下、「Run Exiting/OnChange events after value change」というのを選択したらOK。

onchangeイベントのトリガー変更
onchangeイベントのトリガー変更

Comboboxのキーワードを変更した直後に呼ばれるようになります。

これだけ。

「てか、この設定いるの?」と疑問(笑) OnChangeイベントが直後に呼ばれたら困る状況ってあるのかな? 一応Domino 8.5までのAdvanced Application Developerだけど、こんな設定気づきもしなかったです(><)

以下は、IBMのTechnote(英語)から

WorkaroundTo configure the OnChange event to trigger when a new keyword is selected, you can select the option "Run Exiting/OnChange events after value change". This option is located on the Advanced Options tab Beanie tab of the field properties dialog box.

引用元: IBM - OnChange event does not trigger on keyword change in combobox field.

しかし、今回もネタが小さいw もっとトレンドのある記事が書けるように頑張ります。 xPagesか・・・


Wordpress全てのページで共通のHTMLコードを呼び出す

Wordpressで企業ホームページを作成する機会が増えてきています。

主に「ページ」機能を使って静的ページを作成することになるとおもうのですが、しばしば複数のページの中に同じ情報をブロック単位で埋め込む必要が出てきたりします。

そこで、同じコードはページの中に何回も書くのではなくてブロック単位で切り離して表示したいなぁ~という要望が出てきました。

CakePHPを知っている人でしたらViewにおけるElementのような使い方をしたいというわけです。

もちろん、Widgetを使えるのであればテキスト ウィジェットにHTMLコードを書いてしまえばそれでおしまい、という話なのですが、企業ホームページといった場合には「ブログ」機能を殺さずに自由度の高いな静的コンテンツを必要とするため、ウィジェットが「ページ」には使えなかったりします。

ここで、調べてみたところ、YouTubeコードやFlashコードを埋め込むというプラグインはあるのですが、HTMLコードを切り離して埋め込むといったのがなかなかみつかりませんでした。

そこでようやく見つけたのが、WordpressのCustom Fieldsを使ったHTMLコード共通化の方法です。

Custom Fieldにあまりなじみのない人も多いと思うのですが(実は自分もその一人・・・)、「Get Custom Feild Values」というプラグインと合わせることで全ページに同じHTMLコードを埋め込むといったことが可能になります。

手順としては、

まず、

  1. 「Get Custom Feild Values」プラグインをインストールします
  2. すでに存在する任意のページにいって、カスタムフィールドを1つ作ります。 たとえばIDが”rightmenu”、ValueがHTMLコードといった具合です。
  3. 共通して使っているデザインテンプレートを開き、表示させたい箇所に<?php echo c2c_get_recent_custom('rightmenu'); ?>のように書きます。

以上です。 任意のページに作った1つのカスタムフィールドが全てに反映されるというのは、なんともおかしな実装ですが、割り切って使えばなかなか便利かもしれません。

以下、参考になったサイト:

全てのページで共通のカスタムフィールドを呼び出す

引用元: WordPressプラグイン「Get Custom Field Values」でheadタグ内にCSS・JavaScriptを読み込む | HiGash.Net.