2016年6月4日土曜日

この数ヶ月で学んだこと

2016年3月12日土曜日

Blogger MarkDown記述

クライアント証明書を基礎から学んだ

その前にあまりサーバ証明書についてもよくわかってなかった

まず単語の定義がOSやディストリビューションによって同じものを違う名称で扱うから混乱。

ここの記事が参考になる
http://www.penlabo.net/archives/488

オレオレサーバ証明書を作成


オレオレ認証局(オレオレCA)は以下の流れで作成できる
http://d.hatena.ne.jp/ozuma/20130511/1368284304
  1. サーバー上で「秘密鍵」と「公開鍵」をつくって、公開鍵+秘密鍵のハッシュをガッチャンコした「CSRファイル(署名要求)」を作る。
  2. 「CSRファイル」をCA(普通はVerisignとか)に持って行く
  3. CAの秘密鍵で「CSRファイル」を「サイン」してサーバ証明書(拡張子がCRTとかになってる場合が多い)を生成

中はバイナリみたいになっていて、
openssl x509 -text 
これで内容を確認できる。中は以下
  • 証明書には以下の情報が入っている
  • サーバの情報(コモンネームとか、CSRファイル生成時に入力したやつ)
  • サーバの公開鍵
  • CA名
  • CA電子署名
  • 有効期限
  • 証明書の情報

作成したサーバ証明書はwindowsサーバのIISなら以下のサイトが参考になる。
https://www.ssloff.com/members/knowledgebase.php?action=displayarticle&id=29

Linuxは調べていないけど、たぶんApacheとかに設定入れるんでしょう


以下はオレオレCAがサインするときの流れ。

CA準備
/usr/lib/ssl/misc/CA.sh -newca

// CA証明書(自己署名済みの証明書)生成
// openssl req -new -x509 -newkey rsa:2048 -out cacert.pem -keyout private/cakey.pem -days 1825

サーバ証明書を署名
openssl ca -policy policy_anything -in /vagrant_data/hogehoge_csr.txt -keyfile demoCA/private/cakey.pem -cert demoCA/cacert.pem -out /vagrant_data/hogehoge.crt
CA証明書の(—–BEGIN CERTIFICATE—–)から(—–END CERTIFICATE—–)までをコピーして
テキストエディタに貼り付け、それぞれ任意のファイル名(拡張子: *.cer)で保存

これを前述のwindowsのIISに追加してやる

オレオレクライアント証明書を作成

ここのサイトがとても参考になった
http://www.nslabs.jp/pki-client-certification-with-nginx.rhtml

ユーザの公開鍵、秘密鍵といったものはわざわざ用意&CAが受け取る必要はない。
なぜならCA側でクライアント証明書の署名要求が作成できるから。
(以下では、CSRファイルがnewreq.pemという名前になっているのに注意)
# 以下操作はroot権限でやってました
cd /etc/ssl/client
/usr/lib/ssl/misc/CA.sh -newreq-nodes
# これでnewreq.pemといったファイルが生成される

# 別のSSL設定ファイルを用意する
vim cert-client-req.cnf
# ここの内容は参考サイトを参照してください

# 既存のSSL設定ファイルと置き換え
cd /etc/ssl
mv openssl.cnf openssl_.cnf
mv client/cert-client-req.cnf openssl.cnf

# クライアント証明書生成
openssl ca -policy policy_anything -in client/newreq.pem -keyfile ./demoCA/private/cakey.pem -cert ./demoCA/cacert.pem -out /path/to/your_directory/client.crt

# ここでDatabase Updateに失敗したら、/etc/ssl/demoCA/index.txtに同じものが入っているから消すこと
/path/to/your_directory/client.crt に生成されたこのファイルを、p12形式と呼ばれるものに変換したりして クライアントPCにインストールすると、 クライアント証明書を要求するサイトにアクセスすると、 ブラウザ上にダイアログが出てきて、証明書を選択することになる

クライアント証明書を受け取ったサーバ

クライアント証明書をブラウザから送信し、 サーバーが受け取ると、認証するか否か・・というのは
そのサーバーが信頼しているCAか否かで決まる

じゃあ中間CAで作ったクライアント証明書は、ルートCAがサーバーに信頼されていたら
通過しちゃうの???という疑問はあるけど、よくわかっていない(調べてもいない) 

クライアント証明書を認証すると、サーバー側の環境変数に
 「SSL_CLIENT」から始まる一連の変数で
クライアント証明書の内容を参照することができる。

phpを使っていたら
var_dump ($_SERVER['SSL_CLIENT_DN'])
とかすると面白いぞ

2015年12月13日日曜日

solrに1-gram

N-gramというものは、文字列をN文字ごとに分解して、あってるかなーどうかなーって検索するもの。
2-gramなら「とうきょう」なら「とう」「うき」「きょ」・・のように。
ちゃんと単語の意味を辞書で調べて検索する形態素解析とは別物です。
これが1文字なら1-gram。ユニグラムともいうらしい。

2-gramならデフォルトのサンプルのSolr上に書かれている。
ただ、2-gramなら、例えば商品名や会社名といった、辞書にないものを検索するときに2文字以上だと正しい動作をしない。
そういうわけで1-gramが必要となったので、つくりました。
<fieldtype name="1-gram" class="solr.TextField" omitNorms="false" autoGeneratePhraseQueries="true">
<analyzer>
<tokenizer class="solr.NGramTokenizerFactory" maxGramSize="1" minGramSize="1" />
<!-- normalize width before bigram, as e.g. half-width dakuten combine -->
<filter class="solr.CJKWidthFilterFactory"/>
<filter class="solr.JapaneseReadingFormFilterFactory" useRomaji="false"/>
<!-- for any non-CJK -->
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldtype>

2015年11月30日月曜日

文字スクロールバー

職場でCSSの勉強がてら作ったけど、陽の目をみなかったスクリプト。
単純なスクリプトだけれども、文字数がおおい場合は
枠内をスクロールして、そうでない場合は中央揃えになる。

css
<style>
.message{
 position: relative;
 width: 400px;
 height: 40px;
 background: rgba(0,0,0,0.5);
 overflow: hidden;
 padding: 0 10px;
}
.message p{
 position: absolute;
 line-height: 40px;
 display: table-cell;
 min-width: 380px;
 box-sizing: border-box;
 padding: 0;
 height: 40px;
 text-align: center;
 vertical-align: middle;
 color: white;
 margin: 0;
 white-space: nowrap;
}
</style>
js

<script>
$(function(){
 function imageMessageAnimate(){
var $im = $('.message');
var imw = $im.width();
var $imp = $('.message p');
var impw = $imp.width();
var startdelay = 3000;
var enddelay = 3000;
var refleshtime = 1000;
var animatetime = (impw-imw) * 10;
var sumtime = startdelay + enddelay + refleshtime + animatetime;
if ((impw-imw) > 0){
 $imp.delay(startdelay)
 .animate({
marginLeft: -(impw-imw)+"px",
 }, animatetime , 'linear')
 .delay(enddelay)
 .animate({
opacity: 0.0
 }, refleshtime/2.0, 'swing', function(){
$(this).css('marginLeft', 0);
 })
 .animate({
opacity: 1.0
 }, refleshtime/2.0);
 setTimeout(imageMessageAnimate, sumtime);
}
 }
 imageMessageAnimate();
});
</script>
html

<div class='message'>
 <p>あいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえお</p>
</div>

あいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえおあいうえお

2015年11月8日日曜日

gulpを使う

Gulp.js入門 – コーディングを10倍速くする環境を作る方法まとめ
ここを参考に。 gruntの使用経験はあったけれど、 あちらは設定ファイルが巨大化したりして、いつの間にか記述間違えていたりした。 こっちはすんなりと入ってびっくり。

gulpとBrowsersync

browserによる再読み込みはローカル環境では上記通りだが、 もし仮想環境上にある場合は、proxyモードと呼ばれるもので操作することができるらしい Browsersync - Time-saving synchronised browser testing

gulp.task("server", function() {
  browser({
    server: {
      baseDir: "./"
    }
  });
});
こう書いているが、これではindex.htmlしか確認できないじゃないか! hoge.htmlで作業がしたいんだぞ!と困ったが ブラウザ上のURLが
http://localhost:3000/
だったとすれば
http://localhost:3000/hoge.html
とすれば、普通に確認できたし、更新もされた。 browsersyncでルートディレクトリから下はすべて監視対象なんだな。なんて便利なんだ

gulpとタスク

「gulp」コマンドの後ろにタスク名を書けば、そのタスクを実行できる。 公開用にgulpのタスクを分けてみるとかもできそう。

gulpと引数

gulpに引数を渡す場合は、linuxのオプションみたいに
gulp --hoge=aaaa
とすれば、hogeというキーにaaaaという値が入力される。こうしないとタスク扱いされてしまう

2015年10月28日水曜日

nginxが自動起動しない

起動時のログを確認してみる
less /var/log/boot.log
fsck from util-linux 2.20.1
/dev/sda1: clean, 204174/3866624 files, 1423895/15466240 blocks
Skipping profile in /etc/apparmor.d/disable: usr.bin.firefox
Skipping profile in /etc/apparmor.d/disable: usr.sbin.rsyslogd
* Starting AppArmor profiles ESC[80G ^MESC[74G[ OK ]
Starting memcached: memcached.
Starting nginx: nginx: [emerg] host not found in upstream "hogehoge.co.jp" in /etc/nginx/sites-enabled/default:18
nginx: configuration file /etc/nginx/nginx.conf test failed
※"hogehoge.co.jp"はproxy_passに設定しているドメイン


しかし、手動でコマンド実行では普通に起動する。
nginxは構文チェックの他に名前解決のチェックも行っているようである。
なるほど。ネットワークのサービスが完全に立ち上がる前にnginxが起動しているのが原因?

tester@tester-VirtualBox:~$ ls /etc/rc2.d/
README S20speech-dispatcher S50rsync S91apache2
S20kerneloops S30vboxadd S50saned S99acpi-support
S20memcached S30vboxadd-x11 S70dns-clean S99grub-common
S20nginx S35vboxadd-service S70pppd-dns S99ondemand
S20php5-fpm S50pulseaudio S75sudo S99rc.local
dnsってつくサービスよりも数字が早いぞ。 なので一度、nginxを消し去ってから
sudo update-rc.d -f nginx remove
再度以下コマンドで追加
sudo update-rc.d nginx defaults 91
しかしこれでは直らなかった。 結局hostsファイルにエラーになっていたドメインとIPを記述すると、正常に起動するようになった