feat: x509

This commit is contained in:
2021-05-02 00:16:39 +08:00
parent 8a4132011a
commit df5f4f723e
7 changed files with 267 additions and 0 deletions

View File

@@ -79,6 +79,7 @@ pub struct AcmeConfig {
pub dir: String,
pub auth_timeout: Option<u64>,
pub csr_timeout: Option<u64>,
pub concurrent: Option<u32>, // ?
}
#[derive(Clone, Debug, Serialize, Deserialize)]
@@ -103,6 +104,10 @@ impl AcmeConfig {
pub fn get_csr_timeout(&self) -> u64 {
self.csr_timeout.unwrap_or(5_000)
}
pub fn get_concurrent(&self) -> u32 {
self.concurrent.unwrap_or(0)
}
}
impl CertConfigItem {

View File

@@ -4,6 +4,8 @@ extern crate lazy_static;
extern crate rust_util;
mod config;
mod x509;
mod simple_thread_pool;
use rust_util::XResult;
use acme_lib::{DirectoryUrl, Directory};

30
src/sample_cert.pem Normal file
View File

@@ -0,0 +1,30 @@
-----BEGIN CERTIFICATE-----
MIIFLzCCBBegAwIBAgISA/crxAcU6d5dXfB8WprCO3F2MA0GCSqGSIb3DQEBCwUA
MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD
EwJSMzAeFw0yMTAzMjExMTA1MzlaFw0yMTA2MTkxMTA1MzlaMBcxFTATBgNVBAMT
DHppZ3N0YWNrLm9yZzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAIKS
WNIiChA7I+GKzAQCsP5gNaVuNxGOmfkAzCy9iPPLBaG/bYDATnXQgvKwA+M0uqkD
9g21ZLMadZ0yEEpLuFMWQAgpBXNs3dEaBdKLRywMJEI4NVwFMRy7vFcRqs7tpcvZ
DavIJ7tnwznBykweEn5VSSwxiUDex+uTldA20Ep9FIkTvT2BB6oOaaFiCq7n86AA
kuxHvmvX/6tz+faL8hntWRwPxZA97/dpFobfX0i6P33BPvRAoqpoQQevfA6RiB/j
8TlUr/zeYOTsfBl3E1J6Bm1rAx8n6csj9quY8hFy5/gcJIhCFmSx+YjdvyD/laPo
ZDyEUsWNA3PHV59n0CECAwEAAaOCAlgwggJUMA4GA1UdDwEB/wQEAwIFoDAdBgNV
HSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADAdBgNVHQ4E
FgQUXZjy4SEu/3OoM48AdTCzy892h0gwHwYDVR0jBBgwFoAUFC6zF7dYVsuuUAlA
5h+vnYsUwsYwVQYIKwYBBQUHAQEESTBHMCEGCCsGAQUFBzABhhVodHRwOi8vcjMu
by5sZW5jci5vcmcwIgYIKwYBBQUHMAKGFmh0dHA6Ly9yMy5pLmxlbmNyLm9yZy8w
KQYDVR0RBCIwIIIQd3d3LnppZ3N0YWNrLm9yZ4IMemlnc3RhY2sub3JnMEwGA1Ud
IARFMEMwCAYGZ4EMAQIBMDcGCysGAQQBgt8TAQEBMCgwJgYIKwYBBQUHAgEWGmh0
dHA6Ly9jcHMubGV0c2VuY3J5cHQub3JnMIIBAwYKKwYBBAHWeQIEAgSB9ASB8QDv
AHUAXNxDkv7mq0VEsV6a1FbmEDf71fpH3KFzlLJe5vbHDsoAAAF4VK0xGQAABAMA
RjBEAiBBEcIEe9KGuQJHySF/XYfLjJInOME5uiyU9th2WqZH8QIgAhlfHiehfpIY
EaVLJbCmAccPJHJEj4uYroAxJc9qYVAAdgD2XJQv0XcwIhRUGAgwlFaO400TGTO/
3wwvIAvMTvFk4wAAAXhUrTFBAAAEAwBHMEUCIFSZOj3WOb+lRMRVxlTpM7bS+J8b
DxI1BgGVRMK1h70gAiEA5AQ3XnYal1fo713SzvT9qErr604Y2j41JLNU7OiaNAsw
DQYJKoZIhvcNAQELBQADggEBAGAQeTCB+Xllw3TgATPtwP/Q2znV80T59P3QuGtQ
O3F9ioBRYTP5JhnOEuWrarSqPLlz8/Z6wcoYN5T53/tEmUdGVMVrteN170Cc99XQ
Gl/Yahy5eK3blCm7jDU3Zpo5JjHexKBFeMrwE3kZii0/T9q8YV+7QbBhfND4IzYv
QyE/Tf3hmb7ETmn8FtN60cPGwmI5KWrknsYmAcdgW6q8c1MUMmsrBYMm3bTdQBL2
N1/zk8KYO+ZaBeUBNtEvBAS0/4WcDNcgsE9qts9dQekWZydrEb2Txbz45cNfbUpa
3AwcPmNAmvcFqumUoBUKeaSl4gK1FIhgBdeivD+zjEKGaXI=
-----END CERTIFICATE-----

60
src/simple_thread_pool.rs Normal file
View File

@@ -0,0 +1,60 @@
use rust_util::XResult;
use std::thread;
use std::thread::JoinHandle;
use std::sync::atomic::{AtomicU32, Ordering};
use std::sync::Arc;
use std::time::Duration;
pub struct SimpleThreadPool {
max_pool_size: u32,
running_pool_size: Arc<AtomicU32>,
}
impl SimpleThreadPool {
pub fn new(max_pool_size: u32) -> XResult<Self> {
if max_pool_size > 20 {
return simple_error!("Illegal pool size: {}", max_pool_size);
}
Ok(Self {
max_pool_size,
running_pool_size: Arc::new(AtomicU32::new(0)),
})
}
pub fn submit<F>(&mut self, f: F) -> Option<JoinHandle<()>> where
F: FnOnce() -> (),
F: Send + 'static,
{
let running = self.running_pool_size.fetch_add(1, Ordering::SeqCst);
let running_pool_size_clone = self.running_pool_size.clone();
if running < self.max_pool_size {
Some(thread::spawn(move || {
f();
running_pool_size_clone.fetch_sub(1, Ordering::SeqCst);
}))
} else {
f();
self.running_pool_size.fetch_sub(1, Ordering::SeqCst);
None
}
}
}
#[test]
fn test_simple_thread_pool() {
let mut stp = SimpleThreadPool::new(2).unwrap();
let mut handlers = vec![];
for i in 1..10 {
if let Some(h) = stp.submit(move || {
println!("Task start: {}", i);
thread::sleep(Duration::from_secs(1));
println!("Task end: {}", i);
}) {
handlers.push(h);
}
}
for h in handlers {
h.join().unwrap();
}
}

28
src/x509.rs Normal file
View File

@@ -0,0 +1,28 @@
use x509_parser::parse_x509_certificate;
use x509_parser::pem::parse_x509_pem;
use x509_parser::extensions::ParsedExtension;
use x509_parser::der_parser::oid::Oid;
#[test]
fn test_x509() {
let pem = include_str!("sample_cert.pem");
let (_, parsed_pem) = parse_x509_pem(pem.as_bytes()).unwrap();
let (_, cert) = parse_x509_certificate(parsed_pem.contents.as_slice()).unwrap();
// println!("{:?}", cert);
// println!("{:#?}", cert.subject().iter_common_name());
cert.subject().iter_common_name().for_each(|c| {
use std::str::FromStr;
if c.attr_type == Oid::from_str("2.5.4.3").unwrap() {
println!("{:?}", c.attr_value.content.as_str().unwrap());
}
});
// println!("{:#?}", cert.extensions());
for (oid, ext) in cert.extensions().iter() {
match ext.parsed_extension() {
ParsedExtension::SubjectAlternativeName(san) => {
println!("{:?}", san);
}
_ => {}
}
}
}