PageRenderTime 54ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 1ms

/certs/makecerts.py

https://github.com/dayongxie/zeroc-ice-androidndk
Python | 500 lines | 368 code | 72 blank | 60 comment | 128 complexity | 8df54b288db157f1c3f00be57a3d1cea MD5 | raw file
Possible License(s): GPL-2.0
  1. #!/usr/bin/env python
  2. # **********************************************************************
  3. #
  4. # Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
  5. #
  6. # This copy of Ice is licensed to you under the terms described in the
  7. # ICE_LICENSE file included in this distribution.
  8. #
  9. # **********************************************************************
  10. import os, sys, shutil, subprocess
  11. #
  12. # Show usage information.
  13. #
  14. def usage():
  15. print("Usage: " + sys.argv[0] + " [options] [cpp|java|.net]")
  16. print("")
  17. print("Options:")
  18. print("-h Show this message.")
  19. print("-f Force updates to files that otherwise would be skipped.")
  20. print("-d Debugging output.")
  21. print("")
  22. print("The certificates for all languages are updated if you do not specify one.")
  23. def newer(file1, file2):
  24. file1info = os.stat(file1)
  25. file2info = os.stat(file2)
  26. return file1info.st_mtime > file2info.st_mtime
  27. def prepareCAHome(dir, force):
  28. if force and os.path.exists(dir):
  29. shutil.rmtree(dir)
  30. if not os.path.exists(dir):
  31. os.mkdir(dir)
  32. f = open(os.path.join(dir, "serial"), "w")
  33. f.write("01")
  34. f.close()
  35. f = open(os.path.join(dir, "index.txt"), "w")
  36. f.truncate(0)
  37. f.close()
  38. def jksToBks(source, target):
  39. cmd = "keytool -importkeystore -srckeystore " + source + " -destkeystore " + target + " -srcstoretype JKS -deststoretype BKS " + \
  40. "-srcstorepass password -deststorepass password -provider org.bouncycastle.jce.provider.BouncyCastleProvider -noprompt"
  41. if debug:
  42. print("[debug]", cmd)
  43. p = subprocess.Popen(cmd, shell = True, stdin = subprocess.PIPE, stdout = subprocess.PIPE,
  44. stderr = subprocess.STDOUT, bufsize = 0)
  45. while(True):
  46. line = p.stdout.readline()
  47. if p.poll() is not None and not line:
  48. # The process terminated
  49. break
  50. sys.stdout.write(line)
  51. if line.find("java.lang.ClassNotFoundException: org.bouncycastle.jce.provider.BouncyCastleProvider") != -1:
  52. print("")
  53. print("WARNING: BouncyCastleProvider not found cannot export certificates for android demos in BKS format.")
  54. print(" You can download BKS provider from http://www.bouncycastle.org/download/bcprov-jdk15on-146.jar.")
  55. print(" After download copy the JAR to $JAVA_HOME/lib/ext where JAVA_HOME points to your JRE")
  56. print(" and run this script again.")
  57. print("")
  58. sys.exit(1)
  59. elif line.find("java.security.InvalidKeyException: Illegal key size") != -1:
  60. print("")
  61. print("WARNING: You need to install Java Cryptography Extension (JCE) Unlimited Strength.")
  62. print(" You can download it from Additional Resources section in Orcale Java Download page at:")
  63. print(" http://www.oracle.com/technetwork/java/javase/downloads/index.html.")
  64. print("")
  65. sys.exit(1)
  66. if p.poll() != 0:
  67. sys.exist(1)
  68. #
  69. # Check arguments
  70. #
  71. force = False
  72. debug = False
  73. lang = None
  74. for x in sys.argv[1:]:
  75. if x == "-h":
  76. usage()
  77. sys.exit(0)
  78. elif x == "-f":
  79. force = True
  80. elif x == "-d":
  81. debug = True
  82. elif x.startswith("-"):
  83. print(sys.argv[0] + ": unknown option `" + x + "'")
  84. print("")
  85. usage()
  86. sys.exit(1)
  87. else:
  88. if lang != None or x not in ["cpp", "java", ".net"]:
  89. usage()
  90. sys.exit(1)
  91. lang = x
  92. certs = "."
  93. caHome = os.path.join(certs, "openssl", "ca")
  94. #
  95. # Check for cakey.pem and regenerate it if it doesn't exist or if force is true.
  96. #
  97. caKey = os.path.join(certs, "cakey.pem")
  98. caCert = os.path.join(certs, "cacert.pem")
  99. if not os.path.exists(caKey) or force:
  100. print("Generating new CA certificate and key...")
  101. if os.path.exists(caKey):
  102. os.remove(caKey)
  103. if os.path.exists(caCert):
  104. os.remove(caCert)
  105. prepareCAHome(caHome, force)
  106. config = os.path.join(certs, "openssl", "ice_ca.cnf")
  107. cmd = "openssl req -config " + config + " -x509 -days 1825 -newkey rsa:1024 -out " + \
  108. os.path.join(caHome, "cacert.pem") + " -outform PEM -nodes"
  109. if debug:
  110. print("[debug]", cmd)
  111. os.system(cmd)
  112. shutil.copyfile(os.path.join(caHome, "cakey.pem"), caKey)
  113. shutil.copyfile(os.path.join(caHome, "cacert.pem"), caCert)
  114. cmd = "openssl x509 -in " + caCert + " -outform DER -out " + os.path.join(certs, "cacert.der")
  115. if debug:
  116. print("[debug]", cmd)
  117. os.system(cmd)
  118. else:
  119. print("Skipping CA certificate and key.")
  120. #
  121. # C++ server RSA certificate and key.
  122. #
  123. cppServerCert = os.path.join(certs, "s_rsa1024_pub.pem")
  124. cppServerKey = os.path.join(certs, "s_rsa1024_priv.pem")
  125. if force or not os.path.exists(cppServerCert) or not os.path.exists(cppServerKey) or \
  126. (os.path.exists(cppServerCert) and newer(caCert, cppServerCert)):
  127. print("Generating new C++ server RSA certificate and key...")
  128. if os.path.exists(cppServerCert):
  129. os.remove(cppServerCert)
  130. if os.path.exists(cppServerKey):
  131. os.remove(cppServerKey)
  132. prepareCAHome(caHome, force)
  133. serial = os.path.join(caHome, "serial")
  134. f = open(serial, "r")
  135. serialNum = f.read().strip()
  136. f.close()
  137. tmpKey = os.path.join(caHome, serialNum + "_key.pem")
  138. tmpCert = os.path.join(caHome, serialNum + "_cert.pem")
  139. req = os.path.join(caHome, "req.pem")
  140. config = os.path.join(certs, "openssl", "server.cnf")
  141. cmd = "openssl req -config " + config + " -newkey rsa:1024 -nodes -keyout " + tmpKey + " -keyform PEM" + \
  142. " -out " + req
  143. if debug:
  144. print("[debug]", cmd)
  145. os.system(cmd)
  146. cmd = "openssl ca -config " + config + " -batch -in " + req
  147. if debug:
  148. print("[debug]", cmd)
  149. os.system(cmd)
  150. shutil.move(os.path.join(caHome, serialNum + ".pem"), tmpCert)
  151. shutil.copyfile(tmpKey, cppServerKey)
  152. shutil.copyfile(tmpCert, cppServerCert)
  153. os.remove(req)
  154. else:
  155. print("Skipping C++ server RSA certificate and key.")
  156. #
  157. # C++ client RSA certificate and key.
  158. #
  159. cppClientCert = os.path.join(certs, "c_rsa1024_pub.pem")
  160. cppClientKey = os.path.join(certs, "c_rsa1024_priv.pem")
  161. if force or not os.path.exists(cppClientCert) or not os.path.exists(cppClientKey) or \
  162. (os.path.exists(cppClientCert) and newer(caCert, cppClientCert)):
  163. print("Generating new C++ client RSA certificate and key...")
  164. if os.path.exists(cppClientCert):
  165. os.remove(cppClientCert)
  166. if os.path.exists(cppClientKey):
  167. os.remove(cppClientKey)
  168. prepareCAHome(caHome, force)
  169. serial = os.path.join(caHome, "serial")
  170. f = open(serial, "r")
  171. serialNum = f.read().strip()
  172. f.close()
  173. tmpKey = os.path.join(caHome, serialNum + "_key.pem")
  174. tmpCert = os.path.join(caHome, serialNum + "_cert.pem")
  175. req = os.path.join(caHome, "req.pem")
  176. config = os.path.join(certs, "openssl", "client.cnf")
  177. cmd = "openssl req -config " + config + " -newkey rsa:1024 -nodes -keyout " + tmpKey + " -keyform PEM" + \
  178. " -out " + req
  179. if debug:
  180. print("[debug]", cmd)
  181. os.system(cmd)
  182. cmd = "openssl ca -config " + config + " -batch -in " + req
  183. if debug:
  184. print("[debug]", cmd)
  185. os.system(cmd)
  186. shutil.move(os.path.join(caHome, serialNum + ".pem"), tmpCert)
  187. shutil.copyfile(tmpKey, cppClientKey)
  188. shutil.copyfile(tmpCert, cppClientCert)
  189. os.remove(req)
  190. else:
  191. print("Skipping C++ client RSA certificate and key.")
  192. #
  193. # C++ DSA parameters.
  194. #
  195. dsaParams = os.path.join(certs, "dsaparam1024.pem")
  196. if (lang == "cpp" or lang == None) and (force or not os.path.exists(dsaParams)):
  197. print("Generating new C++ DSA parameters...")
  198. if os.path.exists(dsaParams):
  199. os.remove(dsaParams)
  200. prepareCAHome(caHome, force)
  201. cmd = "openssl dsaparam -out " + dsaParams + " -outform PEM 1024"
  202. if debug:
  203. print("[debug]", cmd)
  204. os.system(cmd)
  205. else:
  206. print("Skipping C++ DSA parameters.")
  207. #
  208. # C++ server DSA certificate and key.
  209. #
  210. cppServerCertDSA = os.path.join(certs, "s_dsa1024_pub.pem")
  211. cppServerKeyDSA = os.path.join(certs, "s_dsa1024_priv.pem")
  212. if (lang == "cpp" or lang == None) and \
  213. (force or not os.path.exists(cppServerCertDSA) or not os.path.exists(cppServerKeyDSA) or \
  214. (os.path.exists(cppServerCertDSA) and newer(caCert, cppServerCertDSA)) or \
  215. (os.path.exists(cppServerCertDSA) and newer(dsaParams, cppServerCertDSA))):
  216. print("Generating new C++ server DSA certificate and key...")
  217. if os.path.exists(cppServerCertDSA):
  218. os.remove(cppServerCertDSA)
  219. if os.path.exists(cppServerKeyDSA):
  220. os.remove(cppServerKeyDSA)
  221. prepareCAHome(caHome, force)
  222. serial = os.path.join(caHome, "serial")
  223. f = open(serial, "r")
  224. serialNum = f.read().strip()
  225. f.close()
  226. tmpKey = os.path.join(caHome, serialNum + "_key.pem")
  227. tmpCert = os.path.join(caHome, serialNum + "_cert.pem")
  228. req = os.path.join(caHome, "req.pem")
  229. config = os.path.join(certs, "openssl", "server.cnf")
  230. cmd = "openssl req -config " + config + " -newkey dsa:" + dsaParams + " -nodes -keyout " + tmpKey + \
  231. " -keyform PEM -out " + req
  232. if debug:
  233. print("[debug]", cmd)
  234. os.system(cmd)
  235. cmd = "openssl ca -config " + config + " -batch -in " + req
  236. if debug:
  237. print("[debug]", cmd)
  238. os.system(cmd)
  239. shutil.move(os.path.join(caHome, serialNum + ".pem"), tmpCert)
  240. shutil.copyfile(tmpKey, cppServerKeyDSA)
  241. shutil.copyfile(tmpCert, cppServerCertDSA)
  242. os.remove(req)
  243. else:
  244. print("Skipping C++ server DSA certificate and key.")
  245. #
  246. # C++ client DSA certificate and key.
  247. #
  248. cppClientCertDSA = os.path.join(certs, "c_dsa1024_pub.pem")
  249. cppClientKeyDSA = os.path.join(certs, "c_dsa1024_priv.pem")
  250. if (lang == "cpp" or lang == None) and \
  251. (force or not os.path.exists(cppClientCertDSA) or not os.path.exists(cppClientKeyDSA) or \
  252. (os.path.exists(cppClientCertDSA) and newer(caCert, cppClientCertDSA)) or \
  253. (os.path.exists(cppClientCertDSA) and newer(dsaParams, cppClientCertDSA))):
  254. print("Generating new C++ client DSA certificate and key...")
  255. if os.path.exists(cppClientCertDSA):
  256. os.remove(cppClientCertDSA)
  257. if os.path.exists(cppClientKeyDSA):
  258. os.remove(cppClientKeyDSA)
  259. prepareCAHome(caHome, force)
  260. serial = os.path.join(caHome, "serial")
  261. f = open(serial, "r")
  262. serialNum = f.read().strip()
  263. f.close()
  264. tmpKey = os.path.join(caHome, serialNum + "_key.pem")
  265. tmpCert = os.path.join(caHome, serialNum + "_cert.pem")
  266. req = os.path.join(caHome, "req.pem")
  267. config = os.path.join(certs, "openssl", "client.cnf")
  268. cmd = "openssl req -config " + config + " -newkey dsa:" + dsaParams + " -nodes -keyout " + tmpKey + \
  269. " -keyform PEM -out " + req
  270. if debug:
  271. print("[debug]", cmd)
  272. os.system(cmd)
  273. cmd = "openssl ca -config " + config + " -batch -in " + req
  274. if debug:
  275. print("[debug]", cmd)
  276. os.system(cmd)
  277. shutil.move(os.path.join(caHome, serialNum + ".pem"), tmpCert)
  278. shutil.copyfile(tmpKey, cppClientKeyDSA)
  279. shutil.copyfile(tmpCert, cppClientCertDSA)
  280. os.remove(req)
  281. else:
  282. print("Skipping C++ client DSA certificate and key.")
  283. #
  284. # .NET server RSA certificate and key.
  285. #
  286. csServer = os.path.join(certs, "s_rsa1024.pfx")
  287. if (lang == ".net" or lang == None) and (force or not os.path.exists(csServer) or newer(cppServerCert, csServer)):
  288. print("Generating new .NET server RSA certificate and key...")
  289. if os.path.exists(csServer):
  290. os.remove(csServer)
  291. cmd = "openssl pkcs12 -in " + cppServerCert + " -inkey " + cppServerKey + " -export -out " + csServer + \
  292. " -certpbe PBE-SHA1-RC4-40 -keypbe PBE-SHA1-RC4-40 -passout pass:password"
  293. if debug:
  294. print("[debug]", cmd)
  295. os.system(cmd)
  296. else:
  297. print("Skipping .NET server certificate and key.")
  298. #
  299. # .NET client RSA certificate and key.
  300. #
  301. csClient = os.path.join(certs, "c_rsa1024.pfx")
  302. if (lang == ".net" or lang == None) and (force or not os.path.exists(csClient) or \
  303. (os.path.exists(csClient) and newer(cppClientCert, csClient))):
  304. print("Generating new .NET client RSA certificate and key...")
  305. if os.path.exists(csClient):
  306. os.remove(csClient)
  307. cmd = "openssl pkcs12 -in " + cppClientCert + " -inkey " + cppClientKey + " -export -out " + csClient + \
  308. " -certpbe PBE-SHA1-RC4-40 -keypbe PBE-SHA1-RC4-40 -passout pass:password"
  309. if debug:
  310. print("[debug]", cmd)
  311. os.system(cmd)
  312. else:
  313. print("Skipping .NET client certificate and key.")
  314. #
  315. # Java truststore.
  316. #
  317. truststore = "certs.jks"
  318. if (lang == "java" or lang == None) and (force or not os.path.exists(truststore) or \
  319. (os.path.exists(truststore) and newer(caCert, truststore))):
  320. print("Generating Java truststore...")
  321. if os.path.exists(truststore):
  322. os.remove(truststore)
  323. cacert = os.path.join(certs, "cacert.der")
  324. cmd = "keytool -import -alias cacert -file " + cacert + " -keystore " + truststore + \
  325. " -storepass password -noprompt"
  326. if debug:
  327. print("[debug]", cmd)
  328. os.system(cmd)
  329. else:
  330. print("Skipping Java truststore.")
  331. #
  332. # Java server keystore.
  333. #
  334. serverKeystore = "server.jks"
  335. if (lang == "java" or lang == None) and (force or not os.path.exists(serverKeystore) or \
  336. (os.path.exists(serverKeystore) and newer(cppServerCert, serverKeystore))):
  337. print("Generating Java server keystore...")
  338. if os.path.exists(serverKeystore):
  339. os.remove(serverKeystore)
  340. #
  341. # Convert OpenSSL key/certificate pairs into PKCS12 format and then
  342. # import them into a Java keystore.
  343. #
  344. tmpFile = os.path.join(certs, "server.p12")
  345. cmd = "openssl pkcs12 -in " + cppServerCert + " -inkey " + cppServerKey + " -export -out " + tmpFile + \
  346. " -name rsakey -passout pass:password -certfile " + caCert
  347. if debug:
  348. print("[debug]", cmd)
  349. os.system(cmd)
  350. cmd = "java -classpath . ImportKey " + tmpFile + " rsakey " + caCert + " " + serverKeystore + " password"
  351. if debug:
  352. print("[debug]", cmd)
  353. os.system(cmd)
  354. os.remove(tmpFile)
  355. else:
  356. print("Skipping Java server keystore.")
  357. if not os.path.exists("server.bks") or newer(serverKeystore, "server.bks"):
  358. if os.path.exists("server.bks"):
  359. os.remove("server.bks")
  360. print("Converting Java server truststore to BKS...")
  361. jksToBks("server.jks", "server.bks")
  362. #
  363. # Replace server.bks files in android demo and test directories
  364. #
  365. for d in ['../java/test/android', '../java/demo/android']:
  366. for root, dirnames, filenames in os.walk(d):
  367. for f in filenames:
  368. if f == "server.bks":
  369. shutil.copyfile("server.bks", os.path.join(root, f))
  370. #
  371. # Java client keystore.
  372. #
  373. clientKeystore = "client.jks"
  374. if (lang == "java" or lang == None) and (force or not os.path.exists(clientKeystore) or \
  375. (os.path.exists(clientKeystore) and newer(cppClientCert, clientKeystore))):
  376. print("Generating Java client keystore...")
  377. if os.path.exists(clientKeystore):
  378. os.remove(clientKeystore)
  379. #
  380. # Convert OpenSSL key/certificate pairs into PKCS12 format and then
  381. # import them into a Java keystore.
  382. #
  383. tmpFile = os.path.join(certs, "client.p12")
  384. cmd = "openssl pkcs12 -in " + cppClientCert + " -inkey " + cppClientKey + " -export -out " + tmpFile + \
  385. " -name rsakey -passout pass:password -certfile " + caCert
  386. if debug:
  387. print("[debug]", cmd)
  388. os.system(cmd)
  389. cmd = "java -classpath . ImportKey " + tmpFile + " rsakey " + caCert + " " + clientKeystore + " password"
  390. if debug:
  391. print("[debug]", cmd)
  392. os.system(cmd)
  393. os.remove(tmpFile)
  394. else:
  395. print("Skipping Java client keystore.")
  396. if not os.path.exists("client.bks") or newer(clientKeystore, "client.bks"):
  397. if os.path.exists("client.bks"):
  398. os.remove("client.bks")
  399. print("Converting Java client truststore to BKS...")
  400. jksToBks("client.jks", "client.bks")
  401. #
  402. # Replace client.bks files in android demo and test directories
  403. #
  404. for d in ['../java/test/android', '../java/demo/android']:
  405. for root, dirnames, filenames in os.walk(d):
  406. for f in filenames:
  407. if f == "client.bks":
  408. shutil.copyfile("client.bks", os.path.join(root, f))
  409. #
  410. # Done.
  411. #
  412. print("Done.")