Back home

SENI #010

SENI #010

SENI adalah kegiatan yang diprakarsai oleh 由左耳朵耗子--陈皓: Kerjakan setidaknya satu pertanyaan algoritma leetcode setiap minggu, baca dan komentari setidaknya satu artikel teknis berbahasa Inggris, pelajari setidaknya satu keterampilan teknis, dan bagikan artikel yang berisi opini dan pemikiran. (Artinya, Algoritma, Review, Tip, dan Share disebut sebagai SENI) dan bertahan setidaknya selama satu tahun.

SENI 010

Ini adalah pasal 10

Pertanyaan algoritma algoritma

Saya mengerjakan dua pertanyaan algoritma minggu ini

Pertanyaan 1

pertanyaan algoritma leetcode 767. Atur Ulang String: Kesulitan: Sedang


Given a string S, check if the letters can be rearranged so that two characters that are adjacent to each other are not the same.

If possible, output any possible result.  If not possible, return the empty string.

Example 1:

Input: S = "aab"
Output: "aba"
Example 2:

Input: S = "aaab"
Output: ""
Note:

S will consist of lowercase letters and have length in range [1, 500].

Ide saya untuk menyelesaikan masalah, hal pertama yang saya pikirkan adalah jika jumlah huruf tertentu melebihi setengah panjang S, maka “” harus dikembalikan. Pertanyaannya hanya membutuhkan huruf kecil, jadi saya berpikir untuk menghitung dulu jumlah setiap karakter di string S, lalu saya berpikir untuk mengurutkan berdasarkan jumlah karakter. Terakhir, saya harus mempertimbangkan beberapa kondisi batas, kompleksitas waktu dan kompleksitas ruang. Implementasi spesifiknya adalah sebagai berikut. Waktu berjalan LeetCode adalah 0ms dan kompleksitas waktu adalah O(n).


char* reorganizeString(char* S) {
    int len = strlen(S);
    
    //计算S中每个字母的个数
    //Calculate the number of  letters in S
    int* charCount = (int*)malloc(sizeof(int) * 26);
    memset(charCount, 0, sizeof(int) * 26);
    for (int i = 0; i < len; i++) {
        int index = S[i] - 97;
        charCount[index]++;
    }
    
    //如果某一个字母的个数超过S长度的一半,直接返回""
    //If the number of letters is more than half the length of S, directly return  ""
    for (int i = 0; i < 26; i++) {
        int index  = charCount[i];
        if (index > len/2 + len%2) {
            return "";
        }
    }
   
    
    //"排序",这里的排序是按字母的个数排序,字母多的放到前面。比如S="dddbbbbffkkkkkk",那么排序后的orderS是"kkkkkkbbbbdddff"
    //"sorting",The sorting here is sorted by the number of letters, and put the more letters in front,eg:if S="dddbbbbffkkkkkk",so orderS is "kkkkkkbbbbdddff"
    char * orderS = (char*)malloc(sizeof(char*) * len);
    int count = 0;
    for (int i = 0; i < 26; i++) {
        int  sortingNum = charCount[i];
        int maxIndex = i;
        for (int j =0; j < 26; j++) {
            if (sortingNum < charCount[j] ) {
                sortingNum = charCount[j];
                maxIndex = j;
            }
        }
        for (int j = 0; j < sortingNum; j++) {
            orderS[count++] = maxIndex + 97;
        }
        charCount[maxIndex] = 0;
    }
    
    //打乱顺序 比如orderS是'bbbc ccdd',打乱后就是bcbcbdcd
    //reorganizeString eg: orderS is 'bbbc ccdd', reorganizeString is bcbcbdcd
    int max = len/2;
    int mid = max+ len%2;
    for (int i =0; i < max; i++) {
        S[2*i] =orderS[i];
        S[2*i+1] =orderS[mid+i];
    }
    if (len%2) {
        S[len -1] = orderS[max];
    }
    free(orderS);
    free(charCount);
    
    return S;
}

Pertanyaan 2

pertanyaan algoritma leetcode 541.Reverse String II: Kesulitan: Mudah


Given a string and an integer k, you need to reverse the first k characters for every 2k characters counting from the start of the string. If there are less than k characters left, reverse all of them. If there are less than 2k but greater than or equal to k characters, then reverse the first k characters and left the other as original.
Example:
Input: s = "abcdefg", k = 2
Output: "bacdfeg"
Restrictions:
The string consists of lower English letters only.
Length of the given string and k will in the range [1, 10000]

Pertanyaan ini relatif sederhana, pertimbangkan saja beberapa situasi lagi.

void ReverseString(char* str,int min,int max) {
    int i = min;
    int j = max;
    while (i < j) {
        char temp = * (str + i);
        * (str + i) = * (str + j);
        * (str + j)  = temp;
        
        i++;
        j--;
    }
}

char* reverseStr(char* s, int k) {
    u_long strlength =  strlen(s);
    if ( k == 0) {
        ReverseString(s,0,strlength-1);
        
    }
    else {
        u_long count = strlength/(2*k);
        for (int i = 0; i < count; i++) {
            ReverseString(s,(2*k)*i,(2*k)*i + k-1);
        }
        u_long count_1 = strlength%(2*k);
        if (count_1 > 0) {
            if(count_1<k){//剩余少于 k 个字符
                ReverseString(s,strlength- count_1,strlength -1);
            }
            else{//小于 2k 但大于或等于 k 个字符
                ReverseString(s,strlength- count_1,strlength- count_1  + k -1);
            }
        } 
    }
    return s;
}

Ulasan

Artikel ini berasal dari: https://medium.freecodecamp.org/how-to-become-a-git-expert-e7c38bf54826

Cara menjadi pakar Git Cara menjadi pakar Git

“Fotografi time-lapse seorang pria berdiri di samping jalan dan jembatan pada siang hari” oleh Ahsan Avi di Unsplash Fotografi time-lapse orang-orang yang berdiri di pinggir jalan dan jembatan pada siang hari oleh Ahsan Avi di Unsplash

Saya membuat kesalahan dalam komitmen saya, bagaimana cara memperbaikinya? Saya melakukan kesalahan saat mengirimkan kode, bagaimana cara memperbaikinya?

Riwayat komit saya berantakan, bagaimana cara membuatnya lebih rapi? Riwayat penerapan kode saya berantakan, bagaimana cara menjaganya tetap rapi?

Jika Anda pernah memiliki pertanyaan di atas, maka postingan ini cocok untuk Anda. Posting ini mencakup daftar topik yang akan menjadikan Anda ahli Git. Jika Anda pernah memiliki pertanyaan di atas, maka artikel ini cocok untuk Anda. Artikel ini membahas berbagai topik yang akan menjadikan Anda ahli Git.

Jika Anda tidak mengetahui dasar-dasar Git, klik di sini untuk melihat blog saya tentang dasar-dasar Git. Anda perlu mengetahui dasar-dasar Git untuk memanfaatkan artikel ini sebaik-baiknya. Jika Anda belum mengetahui dasar-dasar Git, silakan klik di sini untuk melihat blog dasar-dasar Git saya. Memahami dasar-dasar Git diperlukan untuk mendapatkan hasil maksimal dari artikel ini.

“piring keramik pecah di lantai” oleh chuttersnap di Unsplash Piring keramik pecah di lantai karena chuttersnap di Unsplash

Skenario 1 Skenario 1

Katakanlah (dengan asumsi) Anda telah mengkomit banyak file dan menyadari bahwa pesan komit yang Anda masukkan sebenarnya tidak jelas. Sekarang Anda ingin mengubah pesan komit. Untuk melakukan ini, Anda dapat menggunakan git commit --amend

Katakanlah Anda mengkomit banyak file dan menyadari bahwa pesan komit yang Anda masukkan sebenarnya tidak jelas. Sekarang pesan komit perlu diubah. Untuk melakukan ini, Anda dapat menggunakan git commit -amend

git commit --amend -m “New commit message”

Skenario 2 Skenario 2

Katakanlah Anda ingin melakukan enam file tetapi, secara tidak sengaja, Anda akhirnya hanya melakukan lima file. Anda mungkin berpikir bahwa Anda dapat membuat komit baru dan menambahkan file ke-6 ke komit tersebut.

Katakanlah Anda ingin mengirimkan 6 file, tetapi secara tidak sengaja, Anda hanya mengirimkan 5 file. Anda mungkin berpikir Anda bisa membuat komit baru dan menambahkan file ke-6 ke komit itu.

Tidak ada yang salah dengan pendekatan ini. Namun, untuk menjaga riwayat komit yang rapi, bukankah lebih baik jika Anda benar-benar dapat menambahkan file ini ke komit Anda sebelumnya? Ini juga dapat dilakukan melalui git commit --amend:

Tidak ada yang salah dengan pendekatan ini. Namun, untuk menjaga riwayat komit tetap rapi, bukankah lebih baik jika Anda bisa menambahkan file ini ke komit sebelumnya? Hal ini dapat dicapai dengan ’ git commit -amend ':

git add file6
git commit --amend --no-edit

--no-edit berarti pesan komit tidak berubah.

Skenario 3 Adegan 3

Setiap kali Anda melakukan komit di Git, komit tersebut memiliki nama penulis dan email penulis yang terkait dengannya. Umumnya, saat Anda menyiapkan Git untuk pertama kalinya, Anda menyiapkan nama penulis dan email. Anda tidak perlu khawatir tentang detail penulis untuk setiap penerapan.

Setiap kali Anda melakukan komit di Git, komit tersebut memiliki nama penulis dan email penulis. Biasanya, saat pertama kali menyiapkan Git, Anda menyiapkan nama penulis dan email. Anda tidak perlu khawatir tentang detail penulis untuk setiap kiriman.

Meskipun demikian, mungkin saja untuk proyek tertentu Anda ingin menggunakan ID email yang berbeda. Anda perlu mengonfigurasi id email untuk proyek itu dengan perintah: Meskipun demikian, Anda mungkin ingin menggunakan ID email yang berbeda untuk proyek tertentu. Anda perlu mengonfigurasi ID email proyek menggunakan perintah berikut:

git config user.email “your email id”

Katakanlah Anda lupa mengkonfigurasi email dan sudah melakukan komitmen pertama Anda. Amend juga dapat digunakan untuk mengubah pembuat komitmen Anda sebelumnya. Penulis komit dapat diubah menggunakan perintah berikut:

Katakanlah Anda lupa mengkonfigurasi email Anda dan Anda sudah membuat komitmen pertama Anda. “Amend” juga dapat digunakan untuk mengubah penulis kiriman Anda sebelumnya. Penulis komit dapat diubah menggunakan:

git commit --amend --author "Author Name <Author Email>"
Tunjuk ke catatan catatan

Gunakan perintah amend hanya di repositori lokal Anda. Menggunakan amend untuk repositori jarak jauh dapat menimbulkan banyak kebingungan. Hanya gunakan perintah “amend” di repositori lokal. Menggunakan amandemen dengan repositori jarak jauh dapat menyebabkan banyak kebingungan.

Riwayat Komit saya berantakan. Bagaimana cara menanganinya? Riwayat komit saya berantakan. Bagaimana cara menghadapinya?

Katakanlah Anda sedang mengerjakan sebuah kode. Anda tahu bahwa penyelesaian kode ini memerlukan waktu sekitar sepuluh hari. Dalam sepuluh hari tersebut, pengembang lain juga akan memasukkan kode ke repositori jarak jauh. Katakanlah Anda sedang mengerjakan sebuah kode. Soalnya, kode tersebut membutuhkan waktu sekitar 10 hari untuk diselesaikan. Selama sepuluh hari ini, pengembang lain juga akan memasukkan kode ke repositori jarak jauh.

Merupakan praktik yang baik untuk selalu memperbarui kode repositori lokal Anda dengan kode di repositori jarak jauh. Hal ini untuk menghindari banyak konflik penggabungan nanti ketika Anda mengajukan permintaan penarikan. Jadi Anda memutuskan bahwa Anda akan menarik perubahan dari repositori jarak jauh setiap dua hari sekali.Merupakan praktik yang baik untuk selalu memperbarui kode repositori lokal Anda dengan kode di repositori jarak jauh. Hal ini menghindari banyak konflik penggabungan saat membuat permintaan penarikan di masa mendatang. Jadi, Anda memutuskan untuk mengambil perubahan dari repositori jarak jauh setiap dua hari.

Setiap kali Anda menarik kode dari repositori jarak jauh ke repositori lokal, komit gabungan baru dibuat di repositori lokal Anda. Ini berarti riwayat penerapan lokal Anda akan memiliki banyak komitmen gabungan yang dapat membuat segalanya tampak membingungkan bagi pengulas. Setiap kali kode ditarik dari repositori jarak jauh ke repositori lokal, komit gabungan baru dibuat di repositori lokal. Ini berarti riwayat penerapan lokal Anda akan memiliki banyak penerapan gabungan, yang akan membingungkan pengulas.

Berikut adalah tampilan riwayat penerapan di repositori lokal Anda. Berikut tampilan riwayat penerapan di repositori lokal Anda.

Bagaimana caranya agar histori commit terlihat lebih rapi? Di sinilah rebase datang untuk menyelamatkan. Bagaimana saya bisa membuat riwayat komit saya terlihat lebih bersih? Di sinilah rebase datang untuk menyelamatkan.

Apa itu rebasing? Izinkan saya menjelaskan ini melalui sebuah contoh.

Diagram ini menunjukkan penerapan di cabang rilis dan cabang fitur Anda

  1. Cabang Rilis memiliki tiga komit: Rcommit1, Rcommit2, dan Rcommit3.
  2. Anda membuat cabang Fitur dari cabang Rilis ketika cabang tersebut hanya memiliki satu komit, yaitu Rcommit1.
  3. Anda telah menambahkan dua komitmen ke cabang Fitur. Mereka adalah Fcommit1 dan Fcommit2.
  4. Tujuan Anda adalah memasukkan komit dari cabang Rilis ke cabang Fitur Anda.
  5. Anda akan menggunakan rebase untuk melakukan ini.
  6. Biarkan nama cabang Rilis menjadi rilis dan nama cabang Fitur menjadi fitur.
  7. Rebasing dapat dilakukan dengan menggunakan perintah berikut:

Diagram ini menunjukkan penerapan di cabang rilis dan cabang fitur

  1. Cabang Rilis memiliki tiga komit: Rcommit1, Rcommit2 dan Rcommit3.
  2. Ketika cabang Rilis hanya memiliki satu komit (yaitu Rcommit1), Anda membuat cabang Fitur dari cabang rilis.
  3. Anda telah menambahkan dua komitmen ke cabang Fitur. Mereka adalah Fcommit1 dan Fcommit2.
  4. Tujuan Anda adalah menggabungkan komit dari cabang Rilis ke cabang Fitur Anda.
  5. Anda perlu menggunakan rebase untuk melakukan ini.
  6. Biarkan nama cabang Rilis menjadi rilis dan nama cabang Fitur menjadi fitur.
  7. Anda dapat menggunakan perintah berikut untuk melakukan rebasing:
git checkout feature
git rebase release

Rebasing

Saat melakukan rebasing, tujuan Anda adalah memastikan cabang Fitur mendapatkan kode terbaru dari cabang Rilis.

Rebasing mencoba menambahkan setiap komit, satu per satu, dan memeriksa konflik. Apakah itu terdengar membingungkan?

Izinkan saya menjelaskannya dengan bantuan diagram.

Ini menunjukkan apa yang sebenarnya dilakukan rebasing secara internal:

Rebase Saat melakukan rebasing, tujuan Anda adalah memastikan bahwa cabang Fitur mendapatkan kode terbaru dari cabang Rilis.

rebase mencoba menambahkan setiap komit satu per satu dan memeriksa konflik. Kedengarannya membingungkan?

Izinkan saya menjelaskannya dengan diagram.

Ini menunjukkan apa yang sebenarnya dilakukan rebase secara internal:

Langkah 1

  1. Saat Anda menjalankan perintah, cabang Fitur diarahkan ke kepala cabang Rilis.
  2. Sekarang cabang Fitur memiliki tiga komit: Rcommit1, Rcommit2, dan Rcommit3.
  3. Anda mungkin bertanya-tanya apa yang terjadi dengan Fcommit1 dan Fcommit2.
  4. Komit masih ada dan akan digunakan pada langkah-langkah di bawah ini. Langkah 2
  5. Sekarang Git mencoba menambahkan Fcommit1 ke cabang Fitur.
  6. Jika tidak ada konflik, Fcommit1 ditambahkan setelah Rcommit3
  7. Jika ada konflik, Git akan memberi tahu Anda, dan Anda harus menyelesaikan konflik tersebut secara manual. Langkah 3
  8. Setelah Fcommit1 ditambahkan, Git akan mencoba menambahkan Fcommit2.
  9. Sekali lagi, jika tidak ada konflik, Fcommit2 ditambahkan setelah Fcommit1 dan rebase berhasil.
  10. Jika ada konflik, Git akan memberitahu Anda, dan Anda harus menyelesaikannya secara manual.
  11. Setelah seluruh rebase selesai, Anda akan melihat bahwa cabang Fitur memiliki Rcommit1, Rcommit2, Rcommit3, Fcommit1, dan Fcommit2.

Langkah 1

  1. Saat menjalankan perintah, cabang fitur menunjuk ke kepala cabang rilis.
  2. Cabang fitur sekarang memiliki tiga komit: Rcommit1, Rcommit2 dan Rcommit3.
  3. Anda mungkin bertanya-tanya apa yang terjadi dengan Fcommit1 dan Fcommit2.
  4. Komit masih ada dan akan digunakan pada langkah selanjutnya. Langkah 2
  5. Sekarang Git mencoba menambahkan Fcommit1 ke cabang fitur.
  6. Jika tidak ada konflik, tambahkan Fcommit1 setelah Rcommit3
  7. Jika ada konflik, Git akan memberi tahu Anda dan Anda harus menyelesaikan konflik tersebut secara manual. Langkah 3
  8. Setelah menambahkan Fcommit1, Git akan mencoba menambahkan Fcommit2.
  9. Demikian pula, jika tidak ada konflik setelah Fcommit1, tambahkan Fcommit2 setelah Fcommit1, dan rebase berhasil.
  10. Jika terjadi konflik, Git akan memberitahu Anda dan Anda harus menyelesaikannya secara manual.
  11. ditampilkan. Setelah menyelesaikan seluruh rebase, Anda akan melihat bahwa cabang Fitur adalah Rcommit1, Rcommit2, Rcommit3, Fcommit1 dan Fcommit2.

Hal yang perlu diperhatikan

  1. Rebase dan Merge berguna di Git. Yang satu tidak lebih baik dari yang lain.
  2. Jika terjadi penggabungan, Anda akan memiliki komit penggabungan. Dalam kasus rebase tidak ada komit tambahan seperti komit gabungan.
  3. Salah satu praktik terbaik adalah menggunakan perintah pada titik berbeda. Gunakan rebase ketika Anda memperbarui repositori kode lokal Anda dengan kode terbaru dari repositori jarak jauh. Gunakan penggabungan ketika Anda berurusan dengan permintaan tarik untuk menggabungkan kembali cabang Fitur dengan cabang Rilis atau Master.

Catatan

  1. Di Git, Rebase dan Merge berguna. Yang satu tidak lebih baik dari yang lain.
  2. Jika terjadi penggabungan, Anda akan memiliki komit penggabungan. Dalam kasus rebase, tidak ada komit tambahan seperti komit gabungan.
  3. Praktik terbaik adalah menggunakan perintah berbeda di tempat berbeda. Gunakan rebase saat memperbarui repositori kode lokal Anda dengan kode terbaru dari repositori jarak jauh. Saat memproses permintaan tarik, gunakan gabungan untuk menggabungkan cabang fitur kembali ke cabang rilis atau cabang master.

Selamat

Anda sekarang adalah pakar Git 😃Dalam posting ini Anda telah belajar tentang:

  • mengubah komitmen
  • rebase Kedua hal ini merupakan konsep yang sangat berguna. Jelajahi dunia Git untuk mempelajari lebih lanjut.

Selamat

Anda sekarang adalah pakar Git

Dalam artikel ini Anda mempelajari:

  • Ubah dan kirimkan *Rebase Kedua konsep tersebut berguna. Jelajahi dunia Git dan pelajari lebih lanjut.

Tentang penulis Saya menyukai teknologi dan mengikuti kemajuan di bidangnya. Saya juga suka membantu orang lain dengan pengetahuan teknologi saya.

Jangan ragu untuk terhubung dengan saya di akun LinkedIn saya https://www.linkedin.com/in/aditya1811/

Anda juga dapat mengikuti saya di twitter https://twitter.com/adityasridhar18

Postingan Lain dari Saya Pengantar Git

Cara menggunakan Git secara efisien

TIPS:

Cara menggunakan layanan-itms untuk menginstal server distribusi ipa yang dikemas dengan sertifikat perusahaan

Proses pengaturan server relatif sederhana. Anda dapat menggunakan Baidu atau Google sendiri. Saya menggunakan nginx di Mac

Server yang saya gunakan adalah Mac Nginx. Konfigurasinya sangat sederhana dan ada banyak tutorial di Internet. Kuncinya sekarang adalah cara mengaktifkan https.

Setelah sistem IOS7.1, jika Anda ingin menggunakan sertifikat perusahaan ($299) untuk menginstal ipa online melalui layanannya, Anda harus menggunakan protokol https.

nginx mengaktifkan konfigurasi https: https://www.jianshu.com/p/fe0fadb38600、

Ada langkah restart di artikel tadi: layanan pembuatan bir restart nginx

Disarankan untuk mengaktifkan errorlog pada file konfigurasi nginx, sehingga jika terjadi error pada saat proses startup, Anda dapat melihatnya secara langsung. Beberapa kesalahan tidak dapat dilihat di terminal. Misalnya, ketika saya menggunakan layanan brew restart nginx untuk memulai ulang, itu menunjukkan kesuksesan.

Stopping `nginx`... (might take a while)
==> Successfully stopped `nginx` (label: homebrew.mxcl.nginx)
==> Successfully started `nginx` (label: homebrew.mxcl.nginx)

Namun nyatanya gagal.

Kemudian saya melihat di errlog: bind() hingga 0.0.0.0:443 gagal (13: Izin ditolak)

Perlu menggunakan: sudo brew services restart nginx untuk memulai

Disini ada konsep yang membutuhkan CA, penjelasan tentang CA: https://www.cnblogs.com/handsomeBoys/p/6556336.html、https://www.jianshu.com/p/57066821b863 Sederhananya, mengaktifkan https memerlukan sertifikat. Sertifikat ini perlu diterapkan ke situs web resmi pihak ketiga, atau Anda dapat membuatnya sendiri. Tentunya website https yang berjalan online harus diproses seperti website resmi pihak ketiga. Karena sertifikat yang dibuat sendiri mengharuskan pengguna untuk menginstalnya secara manual, dan browser tidak mempercayainya. Tidak ada gunanya https jika ada yang bisa membuat sertifikat. Namun tujuan kami saat ini adalah menggunakannya di LAN perusahaan, jadi kami menggunakan sertifikat yang dibuat sendiri. Sertifikat yang dibuat sendiri perlu diinstal secara manual oleh pengguna.

Artikel di bawah ini tentang pengaturan layanannya juga sangat jelas: http://www.cnblogs.com/feiyiban588/p/5788310.html https://blog.csdn.net/RazerTang/article/details/46898051/

Anda juga dapat membuat CA dengan mengikuti langkah-langkah berikut:

Buat CA Anda sendiri

1. Pendahuluan

Sebelumnya, blog saya mendukung https dan menggunakan sertifikat gratis satu tahun yang dikeluarkan oleh StartCom CA. StartCom adalah CA tepercaya. Sertifikat akarnya dipercaya oleh berbagai sistem operasi dan browser, sehingga sertifikat yang dikeluarkannya juga akan dipercaya.

Saya baru-baru ini membuat program unggah dan unduh paket ipa iOS, yang juga memerlukan penggunaan tautan https. Saya memeriksanya secara online dan ternyata saya bisa menandatangani sendiri sertifikatnya, jadi saya mempraktikkannya. Berikut langkah detailnya.

Saya sangat merekomendasikan situs web di bawah ini, yang membahasnya dengan…sangat detail.

https://jamielinux.com/docs/openssl-certificate-authority/index.html

Ada beberapa fungsi dalam tutorial yang hanya perlu Anda pahami, tetapi kita tidak perlu menggunakannya, jadi saya menghapus beberapa langkah untuk membuatnya lebih sederhana dan mudah digunakan.

2. CA

Saat Anda sendiri bertindak sebagai CA, Anda menggunakan perintah openssl untuk membuat sertifikat root Anda sendiri dan membiarkan pengguna menginstal dan memercayainya. Maka semua sertifikat yang ditandatangani dengan sertifikat akar ini juga dapat dipercaya.

Jadi sebagai CA, pertama-tama kita harus membuat sertifikat root ca.cert.pem sendiri, dan membuat sertifikat root memerlukan ca.key.pem.

mulai Buat folder /root/ca. Semua operasi CA akan dilakukan di folder ini.


 # mkdir /root/ca
    # cd /root/ca
    # mkdir certs crl newcerts private
    # chmod 700 private
    # touch index.txt
    # echo 1000 > serial
    # touch openssl.cnf
    

/root/ca: folder CA

/root/ca/certs: Lokasi penyimpanan sertifikat dan sertifikat root yang baru ditandatangani

/root/ca/crl: Lokasi penyimpanan file permintaan sertifikat

/root/ca/newcerts: Lokasi penyimpanan sertifikat yang baru ditandatangani, yang merupakan cadangan dari /root/ca/certs

/root/ca/private : lokasi penyimpanan ca.key.pem, jangan sampai hilang

/root/ca/index.txt: Catatan tanda tangan sertifikat

/root/ca/serial: Nomor seri tanda tangan sertifikat berikutnya, disimpan ke index.txt

Salin konten berikut ke /root/ca/openssl.cnf

# OpenSSL root CA configuration file.
# Copy to `/root/ca/openssl.cnf`.

[ ca ]
# `man ca`
default_ca = CA_default

[ CA_default ]
# Directory and file locations.
dir               = /root/ca
certs             = $dir/certs
crl_dir           = $dir/crl
new_certs_dir     = $dir/newcerts
database          = $dir/index.txt
serial            = $dir/serial
RANDFILE          = $dir/private/.rand

# The root key and root certificate.
private_key       = $dir/private/ca.key.pem
certificate       = $dir/certs/ca.cert.pem

# For certificate revocation lists.
crlnumber         = $dir/crlnumber
crl               = $dir/crl/ca.crl.pem
crl_extensions    = crl_ext
default_crl_days  = 30

# SHA-1 is deprecated, so use SHA-2 instead.
default_md        = sha256

name_opt          = ca_default
cert_opt          = ca_default
default_days      = 3750
preserve          = no
policy            = policy_strict

[ policy_strict ]
# The root CA should only sign intermediate certificates that match.
# See the POLICY FORMAT section of `man ca`.
countryName             = match
stateOrProvinceName     = match
organizationName        = match
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

[ policy_loose ]
# Allow the intermediate CA to sign a more diverse range of certificates.
# See the POLICY FORMAT section of the `ca` man page.
countryName             = optional
stateOrProvinceName     = optional
localityName            = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

[ req ]
# Options for the `req` tool (`man req`).
default_bits        = 2048
distinguished_name  = req_distinguished_name
string_mask         = utf8only

# SHA-1 is deprecated, so use SHA-2 instead.
default_md          = sha256

# Extension to add when the -x509 option is used.
x509_extensions     = v3_ca

[ req_distinguished_name ]
# See <https://en.wikipedia.org/wiki/Certificate_signing_request>.
countryName                     = Country Name (2 letter code)
stateOrProvinceName             = State or Province Name
localityName                    = Locality Name
0.organizationName              = Organization Name
organizationalUnitName          = Organizational Unit Name
commonName                      = Common Name
emailAddress                    = Email Address

# Optionally, specify some defaults.
countryName_default             = CN
stateOrProvinceName_default     = JiangSu
localityName_default            = NanJing
0.organizationName_default      = SIYOU325
organizationalUnitName_default  = SIYOU325
emailAddress_default            = webmaster@siyou325.com

[ v3_ca ]
# Extensions for a typical CA (`man x509v3_config`).
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true
keyUsage = critical, digitalSignature, cRLSign, keyCertSign

[ v3_intermediate_ca ]
# Extensions for a typical intermediate CA (`man x509v3_config`).
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true, pathlen:0
keyUsage = critical, digitalSignature, cRLSign, keyCertSign

[ usr_cert ]
# Extensions for client certificates (`man x509v3_config`).
basicConstraints = CA:FALSE
nsCertType = client, email
nsComment = "OpenSSL Generated Client Certificate"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth, emailProtection

[ server_cert ]
# Extensions for server certificates (`man x509v3_config`).
basicConstraints = CA:FALSE
nsCertType = server
nsComment = "OpenSSL Generated Server Certificate"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer:always
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth

[ crl_ext ]
# Extension for CRLs (`man x509v3_config`).
authorityKeyIdentifier=keyid:always

[ ocsp ]
# Extension for OCSP signing certificates (`man ocsp`).
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
keyUsage = critical, digitalSignature
extendedKeyUsage = critical, OCSPSigning

Untuk penjelasan detailnya bisa lihat link diatas (recomended banget). Di sini saya akan memilih yang penting.

dir = /root/ca: Ini perlu diubah ke folder CA di atas

policy = policy_strict: Gunakan kebijakan ketat untuk menandatangani sertifikat CA

namanegara_default = CN

0.organizationName_default = SIYOU325 CA

Keduanya adalah nama negara dan organisasi, yang akan ditampilkan pada sertifikat yang dihasilkan. Cukup tandatangani sertifikat CA. Kami hanya menetapkan dua nilai ini dan membiarkan yang lainnya kosong.

[v3_ca]: Konfigurasi ini diperlukan untuk menandatangani sertifikat CA

[server_cert]: Ini diperlukan untuk menandatangani sertifikat server selanjutnya

Hasilkan kunci root

# cd /root/ca
# openssl genrsa -aes256 -out private/ca.key.pem 4096

输入两次密码siyou325123456,这个是很重要的密码,设置严格点。

# chmod 400 private/ca.key.pem

Hasilkan sertifikat root

# cd /root/ca
# openssl req -config openssl.cnf \
      -key private/ca.key.pem \
      -new -x509 -days 7500 -sha256 -extensions v3_ca \
      -out certs/ca.cert.pem

根据提示输入key的密码:siyou325123456
然后一值回车下去,使用默认值

# chmod 444 certs/ca.cert.pem

-hari 7300: Berlaku selama 20 tahun

Pada titik ini, ca.key.pem (kunci root) dan ca.cert.pem (sertifikat root) telah dibuat. Jalurnya adalah sebagai berikut

/root/ca/private/ca.key.pem
/root/ca/certs/ca.cert.pem

Pada titik ini, pembuatan sertifikat akar telah selesai.

Password ca.key.pem adalah siyou325123456 yang sangat penting dan perlu disimpan dengan baik.

ca.cert.pem adalah sertifikat root. Sertifikat ini perlu dikirim ke pengguna agar pengguna dapat menginstal dan memercayainya, sehingga semua sertifikat yang kami tandatangani dengan sertifikat ini dapat dipercaya di masa mendatang.

3. Menghasilkan sertifikat server

Pekerjaan peran CA telah selesai. Sekarang kami menggunakan peran pengguna untuk menghasilkan sertifikat server yang dapat digunakan oleh Tomcat dan nginx.

Asumsikan di sini bahwa nama domain atau alamat IP situs web kita adalah 127.0.0.1, lalu buat folder 127.0.0.1 di direktori yang levelnya sama dengan ca, dan buat sertifikat server di direktori ini.

# mkdir /root/127.0.0.1
# cd /root/127.0.0.1

# openssl genrsa -out server.key 2048
# openssl req -new -key server.key -out server.csr

会出现提示,简单点,除了下面几个,其他的都按回车就可以了。
Country Name输入:CN
Common Name输入域名或ip:127.0.0.1
A challenge password输入:server123456

openssl genrsa -out server.key 2048: 2048 setelah perintah ini mewakili jumlah bit enkripsi. Gunakan 4096 secara ketat. Misalnya, sertifikat root di atas menggunakan ini. Secara umum, 2048 dan 1024 sudah cukup. Semakin besar nilainya maka semakin lama waktu tunggu link https.

Pada titik ini, kunci server kami (server.key) dan permintaan sertifikat (server.csr) dibuat.

Selanjutnya salin server.csr ke ca/crl dan ganti namanya menjadi 127.0.0.1.csr.pem

cp server.csr ../ca/crl/127.0.0.1.csr.pem

Kemudian peran tersebut dialihkan ke peran CA untuk memproses permintaan.

Pertama ubah /root/ca/openssl.cnf

policy            = policy_strict
改为
policy            = policy_loose

policy_strict hanya digunakan saat membuat sertifikat root. Di lain waktu, gunakan saja kebijakan yang longgar.

# cd /root/ca
# openssl ca -config openssl.cnf \
  -extensions server_cert -days 375 -notext -md sha256 \
  -in crl/127.0.0.1.csr.pem \
  -out certs/127.0.0.1.cert.pem

-hari 375: Masa berlaku 375 hari, nilai defaultnya juga 375 hari

Saat ini, Anda akan menemukannya

Ada tambahan 127.0.0.1.cert.pem di bawah /root/ca/certs (ini adalah sertifikat yang dihasilkan) Ada tambahan 1000.pem di bawah sertifikat baru (ini adalah cadangan sertifikat, 1000 diambil dari serial) /root/ca/index.txt memiliki lebih banyak baris

/root/ca/index.txt
V   171014020124Z       1000    unknown /C=CN/ST=Some-State/O=Internet Widgits Pty Ltd/CN=127.0.0.1

Nilai di /root/ca/serial +1 menjadi 1001. Kirim sertifikat /root/ca/certs/127.0.0.1.cert.pem kepada pengguna, dan pekerjaan peran CA selesai.

Setelah mengalihkan peran kembali ke pengguna, kami menyalin 127.0.0.1.cert.pem yang dikirimkan kepada kami oleh CA ke direktori /root/127.0.0.1 dan mengganti namanya menjadi server.crt.

Saat ini kami memiliki tiga file berikut di direktori

server.crt server.csr server.key

server.crt adalah sertifikat yang kita inginkan. Kita dapat mengkonfigurasi nginx untuk mendukung https.

konfigurasi nginx

server {
    listen       443;
    server_name  127.0.0.1;

    ssl on;
    ssl_certificate      /root/127.0.0.1/server.crt;
    ssl_certificate_key  /root/127.0.0.1/server.key;
    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  10m;
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;

    location / {
        proxy_pass   http://127.0.0.1;
    }

    location ~ ^(.*)\/\.svn\/ {
        deny all;
    }
}

Untuk mendukung Tomcat, kita juga perlu melakukan operasi berikut.

# cd /root/127.0.0.1
# openssl pkcs12 -export \
    -in server.crt \
    -inkey server.key \
    -out server.p12

输入两次密码:server123456

# keytool -importkeystore -v \
    -srckeystore  server.p12 \
    -srcstoretype pkcs12 \
    -srcstorepass server123456 \
    -destkeystore server.keystore \
    -deststoretype jks \
    -deststorepass server123456

Direktori file setelah operasi

server.crt      server.csr      server.key  
server.p12      server.keystore 

konfigurasi kucing jantan

<Connector SSLEnabled="true" clientAuth="false" 
keystoreFile="/root/127.0.0.1/server.keystore" 
keystorePass="server123456" 
maxThreads="150" port="8443" protocol="org.apache.coyote.http11.Http11Protocol" scheme="https" secure="true" sslProtocol="TLS"/>

berakhir Jika kita perlu membuat sertifikat server lain di masa mendatang, kita bisa mulai dari 3. Membuat sertifikat server. Sangat mudah bukan?

Referensi:

https://jamielinux.com/docs/openssl-certificate-authority/index.html http://blog.csdn.net/RazerTang/article/details/46898051/ komputer sistem https ca

Bagikan:

1 Anda tidak boleh menunda-nunda ketika melakukan sesuatu. Awalnya saya berencana menyelesaikan dua karya seni minggu ini, tetapi saya sibuk dengan hal lain dan hanya bisa menulis satu. 2 Saya sangat mengagumi Cui Yongyuan. Dia pertama kali melaporkannya ke fbb, dan kemudian seperti yang ditunjukkan di bawah ini, Cui melakukan sesuatu yang banyak orang tidak ingin lakukan, atau hal-hal yang berani mereka lakukan tetapi tidak dapat mereka lakukan. Konsekuensinya, Cui diancam akan dibunuh. Tiongkok kekurangan orang-orang seperti Cui. Semoga Cui aman.