読者です 読者をやめる 読者になる 読者になる

ActiveDirectoryの証明書サービスにsubjectAltName入れる

そもそもSHA1つかってた、時代に取り残されていた

なんかね、もうIEもそろそろヤバイだろうし、いい加減SHA256つかうかと。。。

↓みてハッシュアルゴリズム変えた

Update Microsoft certificate authorities to use the SHA-2 hashing algorithm – CUsoon

コメント欄のスティーブが知りたいことを聞いてくれていてとても助かる。

楽ちん×2と思いながら、いつも通りIISの証明書要求の作成からサーバー証明を発行した。

さて、クライアントにSHA256になったばかりのCA証明をいれてアクセスすると

なんか、「missing_subjectAstName」とか言われてChrome様お怒りになられている。

missing_subjectAstNameについて調べてみる

Fixing Chrome 58+ [missing_subjectAltName] with openssl when using self signed certificates | Alexander Zeitler

Support for commonName matching in Certificates - Chrome Platform Status

ざっくりした理解

  • とにかく最新のChrome様はCNでなくてSANが大事
  • FireFoxもダメなはず?
  • とりあえずレジストリで逃げる人多数

でもね、僕の場合レジストリで逃げることはできない事情があるのです。

AD証明書サービスでSANいれちゃおう

ということで奮闘すること2日間で行きついたサイト

サーバ証明書 : なんでも屋さんの備忘録
How to Request a Certificate With a Custom SAN


またざっくり理解

  • ADはデフォでSANつけない、つけるようにするスイッチがある
  • でもEDITF_ATTRIBUTESUBJECTALTNAME2はむやみにONは危険
  • 要求もなんだか手数が多いよ
  • 日本語で読ませて。。。

手順的MEMO

とりあえず有効にした

> certutil -setreg policy\EditFlags +EDITF_ATTRIBUTESUBJECTALTNAME2
> net stop certsvc
> net start certsvc

mmc >> スナップインの追加 >> 証明書サービス
個人 >> 証明書 >> すべてのタスク >> 詳細設定操作 >> カスタム要求の作成
次へ
カスタム要求 登録ポリシーなしで続行する >> 次へ
(テンプレートなし)レガシーキー >> PKCS #10(p) >> 次へ ※レガシーでないと後々sha256選べんかった
プロパティ
[全般]フレンドリ名は適当
[サブジェクト]
サブジェクト名
 CN:FQDN入れた
 L:入れた
 S:入れた
 C:入れた
 O:入れた
 OU:入れた
 CN:入れた
・別名
 DNSFQDNいれた
[拡張機能]
キーの使用法
・デジタル署名
・キーの暗号化
拡張キー使用法
・サーバー証明
・クライアント証明
[秘密キー]
サイズを2048に
ハッシュアルゴリズム:SHA256

で、ファイルできる。

でCAに要求

>certreq -submit -config CAサーバー\CAの名前 さっき作ったファイルのパス サーバー証明を保存するパス

ここでCAで発行処理を行う

>certreq -retrieve -config CAサーバー\CAの名前 1184 サーバー証明を保存するパス

サーバー証明書いただき

certreq -accept -config CAサーバー\CAの名前 サーバー証明を保存するパス

あとはIISバインディングを変更

無事、Chrome様のお怒りも静まりましたとさ。

もし高校野球の女子マネージャーがドラッカーの『マネジメント』を読んだら

もし高校野球の女子マネージャーがドラッカーの『マネジメント』を読んだら

もし高校野球の女子マネージャーがドラッカーの『マネジメント』を読んだら


今更ながら読んでみた。
泣いた。
時に、中盤のターニングポイントはグッとくる。
成長物語として、普通に面白い。
ザ・ゴール ― 企業の究極の目的とは何かも同じやり口で、面白かった。

本作の特に刺さった所は、
「私は、監督の現実、欲求、価値というものを、まだ引き出せていないんだ。だから、監督に何かを交渉しても、それが上手く通らない。」

これは、キテル。
この覚悟、見習わなくては。

とりあえず、エッセンシャルの助走にはなったか…

【本】スピリチュアルマーケティング

VOICE新書 スピリチュアル・マーケティング

VOICE新書 スピリチュアル・マーケティング

タイトルに“スピリチュアル”を冠しているだけあって、
ちょっと怪しい空気感は否めない。

引き寄せの法則の実践メソッドが
著者のヴィターレさんの体験談や聞いた話を盛り込みつつ紹介されていた。

1)自分の望んでいないことを知る
2)欲しいもの、したいこと、なりたいものを知る
3)意識を明晰にする
4)願望が成就したときの素晴らしい気分を味わう
5)流れに身を委ねる

引き寄せの法則は「わたし今日からキラキラOLやめてギラギラします! 絶対達成する人になる方法」の方が、
“スピリチュアル”的ではなく科学的に説明してくれるのでしっくりくる。
「生物と無生物の間」にでてくる“チャンスは、準備された心に降り立つ”にも通じるものがあると思う。

この本のいいところは、読後感?
目標に向かって流れているハズ、と少し気持ちが楽になる?

疲れた時に再読するかもしれない。


わたし今日からキラキラOLやめてギラギラします! 絶対達成する人になる方法


生物と無生物のあいだ (講談社現代新書)





小西利行著 すごいメモ。

1枚メモ

普段利用しているオムニセブンからオススメメールがきたのでポチ。
アイディア出しに特化したメモの手法が14個。

各所にちりばめられたイラストが良かった。

石ころを磨いてみた

2015/07/12 当然、石を磨きたくなった。
ツルツルに、光沢が出るくらい。

で、電動砥石を購入した。

初めての石は7/19に立ち寄った、
相良の海岸で拾ってきた平べったい石。

1cm✖︎2cm位の大きさ

#60の布ヤスリ→#180の砥石
ここで結構いい感じになった。

その後、#1000→#6000
砥石って番手をあげればツルツル具合も磨きがかかると思ってたけど、
なぜか光沢が消え、マットな仕上がりに…

しょうがないからもう一度#180をかけたところでタイムアップ。



来週はバフかけてみたいなぁ

slackのログをGoogle Driveに保存

Slackを無料アカウントで利用すると、
10,000発言しか残らないらしい。

でも、一括でエクスポートするAPIが提供されているので、
こまめに保存しておけばOK。

GoogleDriveに保存してみた。

GASはじめて触ったけど、クーロン実行もぽちぽちするだけでとっても便利でした。

//*********************************************************************/
//   Slackのログを一括保存
//-------------------------------------------------
//   
//*********************************************************************/
function excSaveLog() {
  //   定数 
  var SLACK_BASE_URL   = "https://slack.com/api";
  var SLACK_API_TOKEN  = "YourSlackAPI Token";
  var LOG_SAVE_FOLDER  = "YourSave Folder";
  var SAVE_PERIOD_HOR  = 2;
  
  //処理開始
  Logger.log("=====   START   =====")
  
  //
  var CHANNEL_LIST_URL = SLACK_BASE_URL + "/channels.list?token=" + SLACK_API_TOKEN;
  var CHANNEL_HIST_URL = SLACK_BASE_URL + "/channels.history?token=" + SLACK_API_TOKEN;
  var datNow           = Utilities.formatDate(new Date() , 'Asia/Tokyo' , 'yyyy_MM_dd_HH_mm_ss');  
  
  //チャンネルリスト取得
  var objChListJson = getJson(CHANNEL_LIST_URL);
  //保存
  saveAsText("ChannelList_" + datNow + ".json"
             ,objChListJson
             ,LOG_SAVE_FOLDER);
  //チャンネルループ
  for(var idxCh = 0; idxCh < objChListJson.channels.length; idxCh++){
    Logger.log(objChListJson.channels[idxCh].name);
    var objChHistJson = getJson(
                           getChannelHistroyURL(CHANNEL_HIST_URL,
                                                objChListJson.channels[idxCh].id,
                                                SAVE_PERIOD_HOR)
                        );
    //保存
    saveAsText( objChListJson.channels[idxCh].name + "_" + getTimePeriodString(SAVE_PERIOD_HOR) + ".json"
               ,objChHistJson
               ,LOG_SAVE_FOLDER);
  }
  
  //処理終了
  Logger.log("=====   END   =====")
}

//*************************************************/
// JSON取得
//--------------------------------------------
// return Json or false
//*************************************************/
function getJson(JSON_URL){
  var Response = UrlFetchApp.fetch(JSON_URL);
  var JsonStr  = Response.getContentText(); 
  if (JsonStr.length > 0){
    return JSON.parse(JsonStr);
  } else {
    return false;
  };
}
//**************************************************/
//   JsonObjectをテキストファイルに保存
//**************************************************/
function saveAsText(FileName,
                    JsonObject,
                    SaveFolderName){
  var txtfile = DriveApp.createFile(FileName, JSON.stringify(JsonObject), MimeType.PLAIN_TEXT);
  var folders = DriveApp.getFoldersByName(SaveFolderName);
  var file    = DriveApp.getFileById(txtfile.getId());
  if(folders.hasNext()){
    var folder = folders.next();
    var newfile = file.makeCopy(folder);
    newfile.setName(FileName);
    DriveApp.removeFile(file);
  }
}
//**************************************************/
//   履歴取得URL
//**************************************************/
function getChannelHistroyURL(BaseUrl,
                              ChannelId,
                              PeriodHour){
  //LatestTime算出
  var latTime = Math.floor( new Date().getTime() / 1000 );
  latTime = latTime - (3600 * PeriodHour);
  latTime = Math.round(latTime / (3600 * PeriodHour)) * (3600 * PeriodHour);
  
  //OldestTime
  var OldTime = latTime - (3600 * PeriodHour);
  
  var retUrl = BaseUrl;
  retUrl = retUrl + "&channel=" + ChannelId;
  retUrl = retUrl + "&latest="  + latTime;
  retUrl = retUrl + "&oldest="  + OldTime;
  
  return retUrl;
}
//**************************************************/
//   期間表示用文字列取得
//**************************************************/
function getTimePeriodString(PeriodHour){
  //LatestTime算出
  var latTime = Math.floor( new Date().getTime() / 1000 );
  latTime = latTime - (3600 * PeriodHour);
  latTime = Math.round(latTime / (3600 * PeriodHour)) * (3600 * PeriodHour);
  
  //OldestTime
  var OldTime = latTime - (3600 * PeriodHour);
  
  var retStr = "";
  retStr = retStr + Utilities.formatDate(new Date(OldTime * 1000) , 'Asia/Tokyo' , 'yyyy_MM_dd_HHmm');
  retStr = retStr + "to"
  retStr = retStr + Utilities.formatDate(new Date(latTime * 1000) , 'Asia/Tokyo' , 'HHmm');
  
  return retStr;
}