たけまるの日記

たけまるの日記です。web関係の技術ネタが多いですが、好きなことを適当に書いています。

【SSL証明書】PositiveSSLを使ってみた【激安】

長らく使える激安SSL証明書といえばRapidSSLが君臨してきましたが、RapidSSLの更に数分の一という価格のPositiveSSLを使ってみました。

円安等の煽りを受けRapidSSLも年間3000円くらいになってしまいましたが、PositiveSSLは年間1000円前後で販売されているようです。(2015年6月現在)

まずは認証経路をば。Chromeで表示した所です。 f:id:takemaru123:20150618173439p:plain

AddTrust External CA Root

COMODO RSA Certification Authority

COMODO RSA DOmain Calidation Secure Server CA

ドメイン

ルート証明書は「AddTrust External CA Root」です。
各端末の搭載状況としては以下のような状況でした。

端末 状況
PCブラウザ 問題なし
iOS 問題なし
Android 問題なし
docomoガラケー 2008年新型番以降の端末の多くは搭載
auガラケー 1機種(W47T)を除き全機種搭載
softbankガラケー 2009年11月以降に発売した端末に搭載

ガラケーSSL対応も全キャリア2G世代が廃止されたことによりだいぶ整理されました。どちらかと言うとルート証明書より端末がSHA-2対応しているかのほうが問題です。

激安証明書のわりに新興認証局というわけではなく、それなりに(?)歴史ある証明書のようです。とりあえずガラケーの事を考えなければ何の問題もなさそうですし、発売年を考えるとガラケーでも大部分は対応していそうです。

ガラケー対応を考えるなら従来通り、安く済ませるならRapidSSL、カバー率100%が必要ならSymantec(Verisign)という状況は今も変わらないようです。

証明書のブランドを気にせず、ブラウザの警告を消したいだけならば今後はPositiveSSLを買っていこうかと思います。

参考

COMODO 携帯電話、スマートフォン、タブレット対応状況
(ドコモ)FOMA機ルート証明書搭載状況
(au) SSL証明書一覧
(softbank) SSL 証明書一覧
携帯電話とSSLルート証明書

macのPHPからcURLでhttpsアクセスすると失敗する件

3時間ほどハマったのでメモ。 PHPcURLからとあるサイトを読み込もうと思っても何故かcurl_exec()からはfalseが帰ってきます。当然全然関係のないサイトを指定すれば問題なく読み込めるのですが…。

curl_error()などを使ってエラー理由を調べた所、以下のようになりました。

Error Number:56
Error String:SSLRead() return error -9806

SSL関係でエラーとなっているようです。確かに読み込もうとしているページはhttpsのページでした。試しに他のhttpsサイトを試しましたがそちらは成功。特定のサーバー相手の場合のみ発生するようです。

いろいろ調べた所、どうもmacのhomebrewでインストールしたPHPSSL通信のライブラリとして「Apple's Secure Transport」とかいうものをリンクするようなのですが、こいつがどうもTLSに対応していない?という事のようなのです。SSLv3は脆弱性が見つかっており無効にしてTLSを使うようにしているサーバーも多いので、そういったサーバーとは通信できずエラーとなるようです。

対症療法としては「Apple's Secure Transport」ではなく普通のOpenSSLライブラリを使うようにPHPを再インストールするという作業になります。私の環境の場合はphp5.6をインストールしている(参考)ので以下その場合の手順となります。

まずこの方法の対象はhomebrewでphpをインストールし、以下のコマンドを実行して所定の結果が出る場合となります。

$ php -i | grep "SSL Version"
↓
SSL Version => SecureTransport

一旦既にインストールしているphpをアンインストールします。

$ brew uninstall php56

homebrewのcurlをインストールします。

brew install --with-openssl curl

Apple's Secure Transportではなく、OpenSSLをリンクするように指定してphpをインストールします。

$ brew install \
    --with-apache \
    --with-homebrew-curl \
    --with-homebrew-openssl \
    --without-snmp \
    --with-apxs2=/usr/sbin/apxs php56
    
$ brew install php56-mcrypt

これで再度コマンドを打って以下のようになれば成功です。

$ php -i | grep "SSL Version"
↓
SSL Version => OpenSSL/1.0.1j

apacheに反映させたい場合はapacheの再起動をお忘れなく。

これで無事にTLSのみ有効なサイトともhttps通信できました。

参考サイト
http://stackoverflow.com/questions/26461966/curl-post-to-https-url-returns-sslread-error

Unable to obtain stable firefox connection in 60 seconds

朝からハマりました。

Seleniumを動かそうとして
「Unable to obtain stable firefox connection in 60 seconds」
のエラーが出て動かず…。

ぐぐったら案の定Stackoverflow様がひっかかりました。
http://stackoverflow.com/questions/14303161/

どうやらFireFoxが自動アップデートされて、selenium-webdriverが対応しなくなったという趣旨の模様。

updateして見事に動くようになりました!

$ sudo gem update selenium-webdriver

めでたしめでたし。

東京都 運転免許証再交付レポ

免許証を財布ごと落としまして、再交付を受けることになりました。

免許証の再交付は都道府県によって若干手続きの場所や方法が異なるようですが、ここでは東京都の例をお伝えいたします。

まず、東京都は都内に3箇所有る運転免許試験場で「のみ」手続きが可能です。
警察署でできる県もあるとの事ですが、東京都の場合はできませんので、その点お気をつけください。

それと免許の更新の場合は土曜も受け付けておりますが、再交付の場合は平日8:30〜16:00のみとなっています。

詳しくはこちらをご確認ください。
免許証の遺失、盗難、汚損、破損による再交付

用意していくものは以下となります。
・申請書用写真(免許証に載る写真とは別、現地でも撮れる)
・身分証明書
・手数料3600円

この身分証明書ですが、上記の警視庁のページには

○ 遺失、盗難の方は、住所、氏名、生年月日を確認できる書類
(保険証、社員証、学生証、住民票、在留カード特別永住者証明書)

と書いています。
が、保険証も財布と一緒に失くしてしまいこちらも再交付中…。

とりあえず電話して聞いてみたら、サイトに記載はないですがパスポートでもOKとの事でしたので、パスポートを持って行くことにしました。

さていよいよ手続き当日。目指すは江東運転免許試験場。

f:id:takemaru123:20150213111337j:plain

ここは東西線東陽町駅から徒歩5分という立地。
鮫洲試験場はへんぴな場所にあり駅からも遠く、府中試験場はそもそも駅から徒歩で行けない場所なので、都内から電車で行くのならば江東試験場がお勧めです。

8:30から受付でしたが出遅れ、到着は8:45頃に…。
まずは総合受付に行き、申請用紙2枚を受け取り、書き込むように指示されます。

この用紙が結構色々なことを書かされます。
今回のように免許証を無くした場合は無くした状況なども記入します。
住所など2枚の申請用紙にほぼ同じことを書かされるのが多少面倒でした。
本籍地の記入も求められますので、本籍地の住所も改め調べておきましょう。

f:id:takemaru123:20150213111105j:plain

その後再交付窓口へ書類提出、身分証確認といくつか事務的な質問をされた後、書類確認のため数分待ちました。
この間にIC免許用の暗証番号カードを、窓口の横においてあった機械で作成。
ちなみに確認したところ、再交付の場合は視力検査は無いとの事でした。

名前を呼ばれ、受付印が押印された書類を持って手数料を支払う窓口へ。
ここで手数料3600円を払います。

その後また再交付窓口に行き、書類を確認した後、免許用の写真を撮るように指示されます。
写真撮影をするところで書類と先ほど作成した暗証番号の紙を提出し、写真撮影。
申請用紙の半券と暗証番号の紙を渡され、免許交付口の4階に行くよう指示されました。

さて、免許証の発行まで暫く時間がかかるという事でしたので、4階にあった食堂で朝ごはんを食べることに。
わかめラーメンカレーセット770円。

f:id:takemaru123:20150213111133j:plain

まずくはないですが、恐らく市販のラーメンをそのまま出している感じで、値段を考えれば普通の市街地にあったら厳しいだろうなーという感じでした。

免許交付口では免許証ができあがると電光掲示板に番号を表示してお知らせしてくれるのですが、食堂で飯を食いながらその電光掲示板が見れます。 ご飯を食べ終わって10分ほど待ったところで免許証ができあがり、受け取ることができました!

f:id:takemaru123:20150213111211j:plain

平日早朝のためか窓口はガラガラで、非常にスムーズに手続きができました。
大体到着から新しい免許証を手にするまで1時間かからないくらいでした。

思ったよりスムーズに再交付を受けることができて良かったです。
私の場合は運転しなくても生活できますが、身分証明書として無いと不便だなと感じました。これでようやく普段の生活に戻れます。

できればやりたくない免許証の再交付ですが、参考になれば幸いです。

CakePHPのMigrationでMySQLのmediumtextを扱う方法

従来手動でAlter管理していたDBにCakePHPのMigrationを導入しようとした所、mediumtext/longtextを扱うのにハマったのでメモ。

MySQLのtext型は最長65,535byteの可変長文字列型ですが、UTF8換算で約2万文字となり、少し容量が足りずmediumtext(最長16MB)を使いたくなる場面があります。しかしCakePHPのMigration Pluginを使ってみると、どうもtext型のみのサポートのようでした。

以下の様なテーブルをまずは作成します。

mysql> CREATE TABLE testtable (id int, message text, medium_message mediumtext, long_message longtext);

これを元にMigrationファイルを作成します。

$ Console/cake Migrations.migration generate -f

結果作成されたMigrationファイルは

'id' => array('type' => 'integer', 'null' => true, 'default' => null, 'unsigned' => false, 'key' => 'primary'),
'message' => array('type' => 'text', 'null' => true, 'default' => null, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'),
'medium_message' => array('type' => 'text', 'null' => true, 'default' => null, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'),
'long_message' => array('type' => 'text', 'null' => true, 'default' => null, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'),

となり、text/mediumtext/longtextを区別せず、すべてtext型として認識されてしまいました。

これでは困るのでCakePHPのコア部分に手を入れて対応することにしました。
とはいえコアファイルを直接編集するわけではなく、CakePHPのクラスオーバーライドの仕組みを利用します。これはapp/Libにコアファイルと同名のクラスファイルを置くと、該当クラスをロードする時にコアのクラスではなく、app/Lib側のクラスに置き換えて読み込む機能です。これでCakePHPのコア自体をアプリのレポジトリに入れなくても済みます。
詳しくは以下をご覧ください。
CakePHP のクラスをオーバーライドする

実際に書き換えた部分は以下です。
元となるMySQLクラスはCakePHP 2.5.8のものです。

## project_path/app/Lib/Model/Datasource/Mysql.php
    // 116行付近
    public $columns = array(
        'primary_key' => array('name' => 'NOT NULL AUTO_INCREMENT'),
        'string' => array('name' => 'varchar', 'limit' => '255'),
        'mediumtext' => array('name' => 'mediumtext'),
        'longtext' => array('name' => 'longtext'),
        'text' => array('name' => 'text'),
    
    // 777行付近
        if (strpos($col, 'mediumtext') !== false) {
            return 'mediumtext';
        }
        if (strpos($col, 'longtext') !== false) {
            return 'longtext';
        }
        if (strpos($col, 'text') !== false) {
            return 'text';
        }

全内容はこちら。
Gist : Mysql.php

これでmediumtext/longtextを利用することができるようになりました。

ちなみにmediumtext/longtextを公式サポートしない理由としては、CakePHPとしてはMySQLPostgreSQL等、DBMSが変わっても同じアプリケーションコードで動くことを目指しているため、DBMSによってかき分ける必要がないようにするのが困難なため、という所だと理解しました。
参考 : LONGTEXT fields on schema generate

今回修正したコードもMySQLを使うことだけを考慮したものですので、そのあたりご理解の上参考にしていただければと思います。

AWSのログインにハードウェアMFAを導入してみた

AWSアカウントのログインにハードウェアMFAを導入してみました。
所謂ワンタイムパスワードで、トークンに表示される数字を入力しないとログインできないようになります。

とりあえず買ったのがコレ。
Ezio Time-based 6-digit OTP Display Card for Use with Amazon Web Services Only

デバイスは新旧2種類出ていて、古いほうが当然安いのですが、同期がずれるという情報があったため新しい方にしました。

amazon.comでしか買えないのが難点ですが、表示が英語とはいえ画面や購入フローは日本のアマゾンと一緒なので案外簡単です。 住所を英語で入れないといけないのですが、行き先が日本という事さえわかれば実際に届けるのは日本人なわけなので、最終的に日本人に分かるように書けばOK。

配送を早い方を選んで、商品代金$19.99 + 送料$15.43 = $35.42となりました。

火曜の朝注文したらその日のうちにアメリカから出荷され、木曜の昼に到着するというクオリティ。アマゾンすげえ。DHLもすげえ。

こんな感じで届きました。

f:id:takemaru123:20150205200701j:plain

開けたらこんな感じ。

f:id:takemaru123:20150205200721j:plain

必要なのはこのカードだけ。
普通のクレジットカードと同じサイズで、感覚的にはそれより薄い!

f:id:takemaru123:20150205200730j:plain

オレンジのボタンを押すと番号が出ます。普段は非表示です。

f:id:takemaru123:20150205200743j:plain

裏側。潰した所のシリアルキーをAWS側に登録して利用します。

f:id:takemaru123:20150205201441j:plain

登録の方法はこちらを参考に。 http://yoshidashingo.hatenablog.com/entry/2014/10/13/164230

ちなみにIAMユーザー(後述)に全権限を与えていても、支払情報をIAMユーザーが見れるようにAWSアカウントでログインして設定しないと見れませんので設定します。

参考
https://www.agilegroup.co.jp/technote/aws-iam.html

登録したらこのカードは金庫にでもしまっておきます。普段使うことはありません。 AWSアカウントが親玉で、その中に実作業をするIAMユーザーを作成し、普段はそちらを使うという感じです。IAMユーザーごとに細かく権限設定ができます。

IAM関係はこちらを参考にするといい感じです。 http://qiita.com/yoshidashingo/items/cd206daca0596659b440

普段使うIAMユーザーのMFAはスマフォにアプリを入れて対応します。 いくつかアプリがあるのですが、メジャーな「Google Authenticator」はスマフォを紛失したりすると復旧できないため却下です。参考サイトでも紹介している「Authy」を使うことにしました。こちらはスマフォを変えても復活することができます。

ちなみにIAMユーザーのMFA変更は最悪AWSアカウントでログインすればできますが、AWSアカウントのMFA再設定はAWSアカウントでログインしない限り不可能です。万一AWSアカウントのMFAを無くしたりすると、電話でAWSサポートに変更依頼(英語)しないといけないらしいので、厳重に管理しましょう。

個人のAWSならrootアカウントもVirtualMFAで良いと思います。 今回は業務利用だったため、AWSアカウントの属人化を避けるためにハードウェアMFAを導入してみました。 あとちょっと厨二心も満たされましたw

デバイス自体は安いのに送料が同じくらいかかるのが難点ですが、ひとつ試してみてはいかがでしょうか。

Ingressエージェント活動に絶対導入すべき3つのアイテム

Ingressをはじめて早1ヶ月、ようやくレベル7まで到達しレベル8まであと少しという所まで来ました。よく訓練されたエージェントの皆様は夜な夜な自宅周辺を徘徊するのがデフォだと思いますが、私も例にもれず夜中チャリンコで走り回ってはCFを作る日々を過ごしております。

そこで、私がエージェント活動をするのに外せない3つのアイテムをご紹介したいと思います。

RAMマウント

最初は自転車のカゴに直接iPhoneを置いたりズボンのポケットに入れたりして走っていたのですが、このマウントを付けてから本当に快適になりました。

f:id:takemaru123:20150118041802j:plain

そう、知る人ぞ知るRAMマウントです。

米国製で米軍も採用しているシロモノです。 少し値ははりますが、これを買って後悔することは無いと断言しておきます。

RAMマウントは種類がかなりたくさん出ていて、何をどこにどう取り付けるか次第で必要なパーツを組み合わせて使います。 実際に自転車にiPhone6 plusを取り付けるのに以下のパーツを導入しました。

まず自転車のハンドル部分にマウントベースを取り付けるのに「RAM-B-231U」を、iPhone6 plusをホールドするのに「RAM-HOL-UN10BU」、その2つを繋ぐのに「RAM-B-201U-A」という構成です。

ちなみにiPhone6(無印)やそれ以前のiPhoneには「RAM-HOL-UN7BU」を使うのが良いようです。

このiPhoneをマウントする部分ですが、四隅のゴムパーツで本体を挟みこむような構造になっています。本当にこれで大丈夫なのか?と最初は思いましたが、実際取り付けて走ってみるともの凄く安定していて、不安感がまったくありません。乱雑に段差を超えたりしてもびくともしません。またベースとマウントを繋ぐジョイントもうまく考えられていて、かなり自由に角度や位置、高さを調整できます。

モバイルバッテリー

Ingressは本当に電池がすぐなくなりますので予備バッテリーは必須です。私はこれを使っています。

2A出力ができるので急速充電が可能です。気づいたらバッテリー残り1%なんて時も、これさえあればタイミングを逃しません。 私は普段の持ち歩きも考慮してミニサイズ(6000mAh)のほうにしていますが、1日中活動するなら大きい方(10400mAh)を買ったほうが良いでしょう。

手袋

それとこの時期(現在1月)に必須なのがスマホ手袋。さすがに素手で自転車を乗るのは厳しいです。手袋を脱がずに操作でき大変快適です。かじかんだ手では正確に攻撃できませんよ!!

まとめ

如何でしたでしょうか。これらを導入すればエージェント活動がより快適になることは間違いなし!! エージェントの皆様はいますぐ導入することをお勧めします!