diff --git a/bin.js b/bin.js
index c7ce856..21e6d60 100644
--- a/bin.js
+++ b/bin.js
@@ -33,6 +33,7 @@ if(program.clear){
     require("./lib/certMgr").generateRootCA(function(){
         process.exit(0);
     });
+
 }else if(program.install){
     npm.load({
         "prefix": process.env.NODE_PATH + '/anyproxy/'
diff --git a/cert/gen-cer.cmd b/cert/gen-cer.cmd
new file mode 100644
index 0000000..d3a6f83
--- /dev/null
+++ b/cert/gen-cer.cmd
@@ -0,0 +1,27 @@
+@echo off
+
+set domain=%1
+set outputPath=%2
+set commonname=%domain%
+ 
+set country=ZH
+set state=Shanghai
+set locality=Shanghai
+set organization=a.com
+set organizationalunit=IT
+set email=a@b.com
+set password=a
+ 
+echo Generating key request for %domain%
+ 
+openssl genrsa -passout pass:%password% -out %domain%.key 2048
+
+
+echo Removing passphrase from key
+openssl rsa -in %domain%.key -passin pass:%password% -out %domain%.key
+ 
+echo Creating CSR
+openssl req -new -key %domain%.key -out %domain%.csr -passin pass:%password% -subj /C=%country%/ST=%state%/L=%locality%/O=%organization%/OU=%organizationalunit%/CN=%commonname%/emailAddress=%email%
+ 
+openssl x509 -req -days 3650 -in %domain%.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out %domain%.crt
+echo Finished
diff --git a/cert/gen-rootCA.cmd b/cert/gen-rootCA.cmd
new file mode 100644
index 0000000..170adc0
--- /dev/null
+++ b/cert/gen-rootCA.cmd
@@ -0,0 +1,12 @@
+@echo off
+
+openssl genrsa -out rootCA.key 2048
+openssl req -x509 -new -nodes -key rootCA.key -days 3650 -out rootCA.crt -subj "/C=CN/ST=SH/L=SH/O=AnyProxy/OU=Section/CN=Anyproxy SSL Proxying/emailAddress=AnyProxy@AnyProxy"
+echo =============
+echo rootCA generated at :
+echo %cd%
+echo =============
+
+start .
+
+rem exit 0
diff --git a/lib/certMgr.js b/lib/certMgr.js
index b27c7a3..c231580 100644
--- a/lib/certMgr.js
+++ b/lib/certMgr.js
@@ -9,16 +9,16 @@ var exec = require('child_process').exec,
     logUtil      = require("./log"),
     asyncTask    = require("async-task-mgr");
 
-//TODO : unstable in windows
-var certDir      = path.join(util.getUserHome(),"/.anyproxy_certs/"),
+var isWin             = /^win/.test(process.platform);
+    certDir           = path.join(util.getUserHome(),"/.anyproxy_certs/"),
     cmdDir            = path.join(__dirname,"..","./cert/"),
-    cmd_genRoot       = path.join(cmdDir,"./gen-rootCA"),
-    cmd_genCert       = path.join(cmdDir,"./gen-cer"),
+    cmd_genRoot       = isWin ? path.join(cmdDir,"./gen-rootCA.cmd") : path.join(cmdDir,"./gen-rootCA"),
+    cmd_genCert       = isWin ? path.join(cmdDir,"./gen-cer.cmd") : path.join(cmdDir,"./gen-cer"),
     createCertTaskMgr = new asyncTask();
 
 if(!fs.existsSync(certDir)){
     try{
-        fs.mkdirSync(certDir,0777); //may fail in windows
+        fs.mkdirSync(certDir,0777);
     }catch(e){
         logUtil.printLog("===========", logUtil.T_ERR);
         logUtil.printLog("failed to create cert dir ,please create one by yourself - " + certDir, logUtil.T_ERR);
@@ -70,9 +70,14 @@ function createCert(hostname,callback){
 }
 
 function clearCerts(cb){
-    exec("rm *.key *.csr *.crt",{cwd : certDir},cb);
+    if(isWin){
+        exec("del * /q",{cwd : certDir},cb);
+    }else{
+        exec("rm *.key *.csr *.crt",{cwd : certDir},cb);        
+    }
 }
 
+
 function isRootCAFileExists(){
    var crtFile = path.join(certDir,"rootCA.crt"),
        keyFile = path.join(certDir,"rootCA.key");
@@ -119,7 +124,9 @@ function generateRootCA(){
             logUtil.printLog(color.green("temp certs cleared"));
 
             var spawnSteam = spawn(cmd_genRoot,['.'],{cwd:certDir,stdio: 'inherit'});
+
             spawnSteam.on('close', function (code) {
+
                 if(code == 0){
                     logUtil.printLog(color.green("rootCA generated"));
                     logUtil.printLog(color.green(color.bold("please trust the rootCA.crt in " + certDir)));